Spring security用户验证机制浅谈.

转载 2015年11月20日 19:32:27

1.  首先CustomUserDetailsService需要实现UserDetailsService(org.springframework.security.core.userdetails.UserDetailsService)接口,实现获取用户Detail信息的回调函数.必须要实现的方法是loadUserByUsername

注意: 这里的user类必须继承userDetail,并且必须继承

  private String password;

  private String username;

  private Set<GrantedAuthority> authorities;

  private booleanaccountNonExpired;

  private booleanaccountNonLocked;

private booleancredentialsNonExpired;

这五个属性

hashCode, equals这两个方法;

构造方法中必须给上述的5个属性赋值, CustomUserDetailsService调用构造方法,生成一个user对象;

如果user不存在,这里可以直接抛出UsernameNotFoundException异常,具体流程自己试验下,前台SPRING_SECURITY_LAST_EXCEPTION显示的错误是:”坏的凭证

 

2.  loadUserByUsername方法返回后会跳到DaoAuthenticationProvider(org.springframework.security.authentication.dao.DaoAuthenticationProvider)类中retrieveUser方法中

3.  retrieveUser方法返回后会跳到

AbstractUserDetailsAuthenticationProvider(org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider) authenticate方法中,这个方法会先到缓存中查找user:

String username =(authentication.getPrincipal() ==null) ?"NONE_PROVIDED" : authentication.getName();

boolean cacheWasUsed =true;

UserDetails user =this.userCache.getUserFromCache(username);

 如果没有的话会从上一步DaoAuthenticationProviderloadUserByUsername方法把user查出来。这里会抛UsernameNotFoundException这个异常,应该是用户不存在这个错误,Bad credentials.

4. authenticate方法里面

preAuthenticationChecks.check(user);这里进行基本有效性验证(是否有效,是否被锁,是否过期);代码如下:

if (!user.isAccountNonLocked()) {

               thrownew LockedException(messages.getMessage("AbstractUserDetailsAuthenticationProvider.locked",

                       "User account is locked"), user);

           }

 

           if (!user.isEnabled()) {

               thrownew DisabledException(messages.getMessage("AbstractUserDetailsAuthenticationProvider.disabled",

                       "User is disabled"), user);

           }

 

           if (!user.isAccountNonExpired()) {

               thrownew AccountExpiredException(messages.getMessage("AbstractUserDetailsAuthenticationProvider.expired",

                       "User account has expired"), user);

            }

 

 

5.  authenticate方法里面

additionalAuthenticationChecks(user,(UsernamePasswordAuthenticationToken) authentication);这里进行密码验证.

additionalAuthenticationChecks调用的是DaoAuthenticationProvider(org.springframework.security.authentication.dao.DaoAuthenticationProvider)中的additionalAuthenticationChecks的方法; 应该是继承的关系;
具体比较的方法写在 Md4PasswordEncoder(
org.springframework.security.authentication.encoding.Md5PasswordEncoder)类中的

 public boolean isPasswordValid(String encPass, String rawPass, Object salt) 方法中; 可是debug中中不到
Md5PasswordEncoder实现的isPasswordValid方法; 这很蹊跷...不过根据配置文件中; 加密方式应该是md5;
<!-- 用户的密码加密或解密 -->
    <bean id="passwordEncoder"
        class="org.springframework.security.authentication.encoding.Md5PasswordEncoder" />

<!-- 注意能够为authentication-manager 设置alias别名  -->
    <authentication-manager alias="authenticationManager">
        <authentication-provider user-service-ref="userDetailsManager">
            <password-encoder ref="passwordEncoder">
                <salt-source user-property="username" />
            </password-encoder>
        </authentication-provider>
    </authentication-manager>
所以应该
Md5PasswordEncoder也有实现isPasswordValid(String encPass, String rawPass, Object salt)这个方法;

至于前台password怎么传到这里; spring security拦截了j_spring_security_check请求; 并把j_password赋给了
DaoAuthenticationProvider(org.springframework.security.authentication.dao.DaoAuthenticationProvider)中passwordEncoder属性; 这个还没验证过;

Spring security用户验证机制浅谈.

1.  首先CustomUserDetailsService需要实现UserDetailsService(org.springframework.security.core.userdetails.U...
  • DR_LF
  • DR_LF
  • 2015年01月10日 11:07
  • 1315

(原创)Spring security用户验证机制浅谈.

1.  首先CustomUserDetailsService需要实现UserDetailsService(org.springframework.security.core.userdetails.U...
  • d7011800
  • d7011800
  • 2013年03月19日 17:05
  • 20177

HTTP安全验证机制和Spring Security

大概看了下,http的基本认证方式有basic,digest两种 参考博文: 详解HTTP中的摘要认证机制    http://blog.csdn.net/tenfyguo/a...
  • live4what
  • live4what
  • 2016年01月12日 04:34
  • 1350

spring security 自定义验证

最近做项目遇到一个棘手的问题, 项目是用spring security来控制权限的,这个框架有一套他自己的验证, 现在项目的要求是除了去数据库验证之外还要调用OA系统验证用户名和密码,就是在原来的基础...
  • wqs1010
  • wqs1010
  • 2013年09月12日 10:08
  • 2790

Spring Security(11)——匿名认证

对于匿名访问的用户,Spring Security支持为其建立一个匿名的AnonymousAuthenticationToken存放在SecurityContextHolder中,这就是所谓的匿名认证...
  • u014756827
  • u014756827
  • 2016年03月22日 16:46
  • 795

Spring Security 实现身份认证

Spring Security可以运行在不同的身份认证环境中,当我们推荐用户使用Spring Security进行身份认证但并不推荐集成到容器管理的身份认证中时,但当你集成到自己的身份认证系统时,它依...
  • shehun1
  • shehun1
  • 2015年03月30日 16:16
  • 19614

SpringSecurity实现登录认证及权限验证

目标在原公司有专门的登录验证和权限管理服务,换公司后在最近项目中需要使用Spring Security自主实现分布式系统的用户验证授权及权限验证功能,因此花了两天时间研究并实现了该方案: 功能点细分...
  • zhangchen2449
  • zhangchen2449
  • 2016年09月22日 15:02
  • 5549

spring security 登录验证

原文:http://www.cnblogs.com/hzhuxin/archive/2011/12/14/2287363.html springSecurity的登录验证是由org.sp...
  • snow1wolf
  • snow1wolf
  • 2014年10月25日 20:03
  • 1433

spirng-boot中,基于既有的token验证方式,利用spring-security实现权限系统

非常感谢  https://segmentfault.com/a/1190000007751220 用过spring-security的都应该能感觉到,spring-security...
  • HUXU981598436
  • HUXU981598436
  • 2017年03月27日 23:04
  • 7172

spring boot 整合 spring security 之使用数据库验证

spring boot 整合 spring security 参见上一篇文章.重写WebSecurityConfigurerAdapter中的configureGlobal方法@Autowired p...
  • shui878412
  • shui878412
  • 2016年11月26日 08:18
  • 2057
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spring security用户验证机制浅谈.
举报原因:
原因补充:

(最多只允许输入30个字)