【发布时间】:2014-12-13 06:58:04
【问题描述】:
我正在尝试为我的登录表单集成 Spring 安全性,但我很难理解 Spring Security 如何验证数据库登录:
所以我已经像这样配置了 spring-security:
<http auto-config="true" use-expressions="true">
<intercept-url pattern="/login" access="permitAll"/>
<intercept-url pattern="/logout" access="permitAll"/>
<intercept-url pattern="/denied" access="hasRole('ROLE_USER')"/>
<intercept-url pattern="/" access="hasRole('ROLE_USER')"/>
<intercept-url pattern="/user" access="hasRole('ROLE_USER')"/>
<intercept-url pattern="/admin" access="hasRole('ROLE_ADMIN')"/>
<form-login login-page="/login"
authentication-failure-url="/login/failure"
default-target-url="/"/>
<access-denied-handler error-page="/denied"/>
<logout invalidate-session="true"
logout-success-url="/logout/success"
logout-url="/logout"/>
</http>
<authentication-manager>
<authentication-provider user-service-ref="loginManager" >
<password-encoder hash="bcrypt" />
</authentication-provider>
</authentication-manager>
这是我的表格;
<c:url var="loginUrl" value="/login"/>
<form method="post" action="${loginUrl}">
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
<div class="form_field">
<label for="login_name">Username / Email</label><br/>
<input class="field" id="login_name" type="text" name="username" autocomplete="off" />
</div>
<div class="form_field">
<label for="password">Password</label><br/>
<input class="field" id="password" type="password" name="password" />
</div>
</form>
这是我的控制器:
@RequestMapping("/login")
public String login(Model model, @RequestParam(required=false) String message) {
model.addAttribute("message", message);
LOGGER.info("Login");
return "/login";
}
@RequestMapping(value = "/denied")
public String denied() {
LOGGER.info("DENIE");
return "/login";
}
@RequestMapping(value = "/login/failure")
public String loginFailure() {
String message = "Login Failure!";
return "redirect:/login?message="+message;
}
@RequestMapping(value = "/logout/success")
public String logoutSuccess() {
String message = "Logout Success!";
return "redirect:/login?message="+message;
}
- 我不明白我们是否需要调用@RequestParam 来获取用户名和密码的字符串,或者Spring 会这样做,因为我已经通知spring 我的登录页面在配置中的位置?
这是我的服务实现了 UserDetailsService:
@Override
@Transactional(readOnly=true)
public UserDetails loadUserByUsername(String name)
throws UsernameNotFoundException {
LOGGER.info("Verify Customer's Account");
Login login = loginDao.getLoginByName(name.toLowerCase());
return new User(login.getName(), login.getPassword(),
true, true, true, true, 'ROLE_USER')));
}
- 由于我的服务实现了 UserDetailsService,我必须重写方法 loadUserByUserName(name)。我想知道如何使用密码验证帐户,或者 Spring 也为我处理(内部如何工作?)?
感谢您的回复。
【问题讨论】:
标签: java spring-mvc spring-security