Spring Security 3.1.1 - 自定义登录成功问题

Posted

技术标签:

【中文标题】Spring Security 3.1.1 - 自定义登录成功问题【英文标题】:Spring Security 3.1.1 - Customizing Login Success problems 【发布时间】:2012-09-03 23:28:07 【问题描述】:

我是 Spring Security 的新手,我一直在阅读 API 和 Javadocs,我相信我需要有关我的问题的帮助。

到目前为止,根据反复试验,我观察到抛出异常会提示身份验证方法自动重定向到登录失败处理程序。从那里,很容易重定向和自定义失败的身份验证流程。但是,在成功登录时,除了 HttpServletRequest、HttpServletResponse、Authentication 对象之外,我似乎无法将任何内容传递给 Login Success Handler。

我的登录成功有两种情况:

    登录成功。

    新用户登录应重定向到更改密码页面。

这里有一些问题:

    在这种情况下可以调用 request.setParameter("status", "FOR_CHANGE_PASSWORD") 吗?安全吗?

    我应该添加“CHANGE_PASSWORD”权限吗?这是好习惯吗?

我的问题是我不想在我的 LoginAuthenticator 中调用 userService 方法,然后在我的 Login Success Handler 上再次调用它只是为了检索用户的状态。有什么解决办法吗?

public class LoginAuthenticator implements AuthenticationProvider
private static final Logger log = LoggerFactory.getLogger(LoginAuthenticator.class);
private static final List<GrantedAuthority> AUTHORITIES = new ArrayList<GrantedAuthority>();
@Autowired
UserService userService;

@Override
public Authentication authenticate(Authentication authentication)
        throws AuthenticationException 
    log.info("Authenticating...");   

    log.debug("Username: " , authentication.getPrincipal());
    log.debug("Password: " , (String) authentication.getCredentials()); 


    WSResponse response = userService.authenticateLogin(username, password);


    //User log-in failure
    if(response.getResponseCode != 200)  

          if(response.getResponseStatus.equals("BAD CREDENTIALS"))
             throw new BadCredentialsException("Bad Credentials");  
          
          else
             throw new AccountStatusException("Account is locked")
           
     
    else
        log.info("User credentials are valid... logging in");
        AUTHORITIES.add(new SimpleGrantedAuthority("USER"));
        return new UsernamePasswordAuthenticationToken(authentication.getPrincipal(),          (String) authentication.getCredentials(), AUTHORITIES);

     



如果有更多建议,那就太好了。

【问题讨论】:

【参考方案1】:

一种典型的方法是将登录用户的所有必要信息存储在其Authentication 中。

例如,标准AuthenticationProviders如DaoAuthenticationProvider在认证成功后构造Authentication对象时将UserDetails的实现存储为principal,应用程序开发人员可以提供自己的UserDetails子类其中包括必要的信息。你可以用同样的方式实现它。

【讨论】:

起初有点难以吸收,但最终成功了。甜!

以上是关于Spring Security 3.1.1 - 自定义登录成功问题的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security入门(3-6)Spring Security 的鉴权 - 自定义权限前缀

spring security自定义指南

Spring Boot + Spring Security自定义用户认证

Gateway 整合 Spring Security鉴权

Spring Security 之自定义UserDetails

Spring Security-用户密码自定义加密