springsecurity之自定义用户认证逻辑处理用户信息获取逻辑处理用户校验逻辑处理密码加密解密注意!注意!视频中启动的是demo 。而这次要写的代码在security-browser中。遇到一个问题也就是在项目结构一文中最后的关于依赖项目没有被扫描到的问 题;如果按照笔记走出现了这个问题。就去项目结构中关于”关于依赖项目没有被扫描到的问题”解决处理用户信息获取逻辑?1org.spri ngframework.security.core.userdetails.UserDetailsServiceUserDetai lsService接口用于加载用户特定的数据,它在整个框架中作为用户DAO使用,是验证提供者使用的策略。该接口只需要一个只读方法, 这简化了对新的数据访问策略的支持。实现一个自定义的UserDetailsService?123456789101112131415 16171819202122232425262728293031323334packagecn.mrcode.imooc.spr ingsecurity.securitybrowser;?importorg.slf4j.Logger;importorg.s lf4j.LoggerFactory;importorg.springframework.security.core.autho rity.AuthorityUtils;importorg.springframework.security.core.user details.User;importorg.springframework.security.core.userdetails .UserDetails;importorg.springframework.security.core.userdetails .UserDetailsService;importorg.springframework.security.core.user details.UsernameNotFoundException;importorg.springframework.ster eotype.Component;?/?${desc}?@authorzhuqiang?@version1.0 .12018/8/39:16?@date2018/8/39:16?@since1.0?///自定义数据源来获 取数据388棋牌http://www.455573.com//这里只要是存在一个自定义的UserDetailsService ,那么security将会使用该实例进行配置@ComponentpublicclassMyUserDetailsServic eimplementsUserDetailsService{?Loggerlogger=LoggerFactory.g etLogger(getClass());??//可以从任何地方获取数据?@Override?publicUserDetail sloadUserByUsername(Stringusername)throwsUsernameNotFoundExce ption{?//根据用户名查找用户信息?logger.info("登录用户名",username);?//写死一个密码, 赋予一个admin权限?returnnewUser(username,"123456",AuthorityUtils.com maSeparatedStringToAuthorityList("admin"));?}}这样就能让自定义的Userdetail sService生效了。但是在浏览器中登录的时候,后台报错了?1java.lang.IllegalArgumentExceptio n:ThereisnoPasswordEncodermappedfortheid"null"这个异常是sprin gsecurity5+后密码策略变更了。必须使用PasswordEncoder方式也就是你存储密码的时候需要使用{noop} 123456这样的方式。这个在官网文档中有讲到花括号里面的是encoderid,这个支持的全部列表在以下的方法中定义?1org .springframework.security.crypto.factory.PasswordEncoderFactories #createDelegatingPasswordEncodernoop对应的处理类是org.springframework.s ecurity.crypto.password.NoOpPasswordEncoder,只用于测试;因为没有做任何加密功能修改完成 之后再次访问。发现可以了小插曲之前由于跳过了视频中的项目结构解说,自己根据经验使用gradle。由于视频中用的maven。我用的g radle。问题还真不少;视频中演示demo项目依赖于我们刚刚配置好的security-browser项目中的自定义UserDe tailsService功能;启动demo项目后发现browser中的配置无法被扫描到;然后重新观看了项目结构这一章节。并把该章节 笔记重新记录下了;有可能会导致一小部分依赖配置和这之前的笔记中有一点点的不一样。不过不要紧。已经解决了处理用户校验逻辑自定义的其他 逻辑是在org.springframework.security.core.userdetails.User中提供的,只要在登 录的时候把user中提供的信息返回即可达到支持的业务逻辑,下面列出支持的业务场景:isEnabled账户是否启用isAccou ntNonExpired账户没有过期isCredentialsNonExpired身份认证是否是有效的isAccountN onLocked账户没有被锁定对于isAccountNonLocked和isEnabled没有做业务处理,只是抛出了对于 的异常信息;?1234//这里的几个布尔值的含义对应上面列出来的顺序Useradmin=newUser(username ,"{noop}123456",?true,true,true,false,天地棋牌http://www.dadiqipa igw.cn?AuthorityUtils.commaSeparatedStringToAuthorityList("admin" ));处理密码加密解密密码加密解密是使用了下面这个类?1org.springframework.security.crypto.p assword.PasswordEncoder在自己摸索中也经常提示这个类或则什么id为null;配置只需要提供一个实例即可,会 自动使用该实例?123456@ConfigurationpublicclassBrowserSecurityConfigex tendsWebSecurityConfigurerAdapter{?@Bean?publicPasswordEncoder passwordEncoder(){?returnnewBCryptPasswordEncoder();?}在UserDe tailsService中需要模拟存入数据库中的密码就是加密后的字符串?12345678910111213141516171819 @ComponentpublicclassMyUserDetailsServiceimplementsUserDetail sService{?Loggerlogger=LoggerFactory.getLogger(getClass());?? @Autowired?privatePasswordEncoderpasswordEncoder;??@Override?pu blicUserDetailsloadUserByUsername(Stringusername)throwsUsern ameNotFoundException{?logger.info("登录用户名:{}",username);?String password=passwordEncoder.encode("123456");?logger.info("数据库密码{} ",password);?Useradmin=newUser(username,//"{noop}123456",pas sword,true,true,true,true,AuthorityUtils.commaSeparatedStringT oAuthorityList("admin"));?}}其实框架会把提交的密码使用我们定义的passwordEncode加密后调用 org.springframework.security.crypto.password.PasswordEncoder#mat ches方法,与返回的User中的密码进行比对。配对正常就验证通过;唯一感觉奇怪的是{noop}123456方式的密码居然可以不 用写了;尝试过{bcrypt}123456还是不行尝试两次登录,发下每次加密的都不一样,但是还能对上结果。感觉很强大;介绍说:对于 同一个串加密多次产生的不一样,就不会存在暴利破解一个串,其他串都失效的情况.金星棋牌http://www.lrnfk.com但是本 人还是没有想明白。总感觉哪里没有想明白一样,不同的串都能反推出来,有啥安全的??12342018-08-0313:45:58.6 14INFO18300---[nio-8080-exec-3]c.m.i.s.s.MyUserDetailsServic e?:登录用户名:admin2018-08-0313:45:58.708INFO18300---[nio-8080- exec-3]c.m.i.s.s.MyUserDetailsService?:数据库密码$2a$10$TaQerjh.VaT RfSLxUozH/eaxgZAcM1H7b0NHEj3peL8Ar8cGfY/R.2018-08-0313:47:08.035 INFO18300---[nio-8080-exec-7]c.m.i.s.s.MyUserDetailsService?:登录用户名:admin2018-08-0313:47:08.128INFO18300---[nio-8080-exec-7]c.m.i.s.s.MyUserDetailsService?:数据库密码$2a$10$jR3gKmOp7LifbXPPHie.JuOW1FmqklzsdZm1spK/r19MkXjpPOa4a总结处理用户信息获取逻辑使用UserDetailsService处理用户校验逻辑使用UserDetails处理密码加密解密使用PasswordEncoder |
|