【问题标题】:Customize Spring Security Authentication自定义 Spring Security 身份验证
【发布时间】: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;
    }
  1. 我不明白我们是否需要调用@RequestParam 来获取用户名和密码的字符串,或者Spring 会这样做,因为我已经通知spring 我的登录页面在配置中的位置?

这是我的服务实现了 UserDetailsS​​ervice:

@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')));
}
  1. 由于我的服务实现了 UserDetailsS​​ervice,我必须重写方法 loadUserByUserName(name)。我想知道如何使用密码验证帐户,或者 Spring 也为我处理(内部如何工作?)?

感谢您的回复。

【问题讨论】:

    标签: java spring-mvc spring-security


    【解决方案1】:

    您需要区分登录页面登录处理URL。登录页面是您的登录表单。登录处理 URL 接收来自用户的输入并验证用户。 Spring Security 将为您完成后面的工作,您应该将表单发布到的默认 URL 是 /j_spring_security_check,并且您的字段应该命名为 j_usernamej_password(使用默认参数名称)。

    您的 UserDetailsS​​ervice 不应进行身份验证(即检查密码是否正确),Spring Security 会为您执行此操作。

    【讨论】:

      猜你喜欢
      • 2014-04-20
      • 2016-08-05
      • 2020-12-05
      • 2015-04-27
      • 2014-01-12
      • 2016-09-05
      • 2021-04-21
      • 2016-10-31
      • 1970-01-01
      相关资源
      最近更新 更多