请选择 进入手机版 | 继续访问电脑版
本站特色:极好的技术研究氛围!所有技术交流,必有回复!

疯狂Java联盟

 找回密码
 加入联盟
查看: 472|回复: 0

Spring Boot2.0连载(50)-- Spring Security核心类

[复制链接]
发表于 2018-6-12 20:59:19 | 显示全部楼层 |阅读模式
更多Spring Boot2.0的知识敬请期待疯狂软件著作《Spring Boot企业应用实战》上市



Spring Security核心类包括 Authentication、SecurityContextHolder、UserDetails、UserDetailsService、GrantedAuthority、DaoAuthenticationProvider和PasswordEncoder。只要掌握了这些Spring Security核心的类,Spring Security就会变得非常简单。
(1)Authentication
Authentication是一个接口,用来表示用户认证信息,在用户登录认证之前,Spring Security会将相关信息封装为一个Authentication具体实现类的对象,在登录认证成功之后又会生成一个信息更全面、包含用户权限等信息的Authentication对象,然后把它保存在SecurityContextHolder所持有的SecurityContext中,供后续的程序进行调用,如访问权限的鉴定等。
(2)SecurityContextHolder
SecurityContextHolder是用来保存SecurityContext的。SecurityContext中含有当前所访问系统的用户的详细信息。默认情况下,SecurityContextHolder将使用ThreadLocal来保存SecurityContext,这也就意味着在处于同一线程的方法中,可以从ThreadLocal获取到当前的SecurityContext。
Spring Security使用一个Authentication对象来描述当前用户的相关信息。SecurityContextHolder中持有的是当前用户的SecurityContext,而SecurityContext持有的是代表当前用户相关信息的Authentication的引用。这个Authentication对象不需要我们自己创建,在与系统交互的过程中,Spring Security会自动创建相应的Authentication对象,然后赋值给当前的SecurityContext。开发中常常需要在程序中获取当前用户的相关信息,比如最常见的是获取当前登录用户的用户名。示例代码如下:
String username = SecurityContextHolder.getContext().getAuthentication().getName();
(3)UserDetails
UserDetails是Spring Security的一个核心接口。其中定义了一些可以获取用户名、密码、权限等与认证相关的信息的方法。Spring Security内部使用的UserDetails实现类大都是内置的User类,要使用UserDetails,也可以直接使用该类。在Spring Security内部,很多需要使用用户信息的时候,基本上都是使用UserDetails,比如在登录认证的时候。
通常需要在应用中获取当前用户的其他信息,如E-mail、电话等。这时存放在Authentication的principal中只包含认证相关信息的UserDetails对象可能就不能满足我们的要求了。这时可以实现自己的UserDetails,在该实现类中可以定义一些获取用户其他信息的方法,这样将来就可以直接从当前SecurityContext的Authentication的principal中获取这些信息。
UserDetails是通过UserDetailsService的loadUserByUsername()方法进行加载的。UserDetailsService也是一个接口,我们也需要实现自己的UserDetailsService来加载自定义的UserDetails信息。
(4)UserDetailsService
Authentication.getPrincipal()的返回类型是Object,但很多情况下返回的其实是一个UserDetails的实例。登录认证的时候Spring Security会通过UserDetailsService的loadUserByUsername()方法获取对应的UserDetails进行认证,认证通过后会将该UserDetails赋给认证通过的Authentication的principal,然后再把该Authentication存入SecurityContext。之后如果需要使用用户信息,可以通过SecurityContextHolder获取存放在SecurityContext中的Authentication的principal。
(5)GrantedAuthority
Authentication的getAuthorities()可以返回当前Authentication对象拥有的权限,即当前用户拥有的权限。其返回值是一个GrantedAuthority类型的数组,每一个GrantedAuthority对象代表赋予给当前用户的一种权限。GrantedAuthority是一个接口,其通常是通过UserDetailsService进行加载,然后赋予UserDetails的。
GrantedAuthority中只定义了一个getAuthority()方法,该方法返回一个字符串,表示对应的权限,如果对应权限不能用字符串表示,则应当返回null。
(6)DaoAuthenticationProvider
Spring Security 默认会使用 DaoAuthenticationProvider实现AuthenticationProvider接口,专门进行用户认证的处理。DaoAuthenticationProvider 在进行认证的时候需要一个 UserDetailsService 来获取用户的信息 UserDetails,其中包括用户名、密码和所拥有的权限等。如果需要改变认证的方式,开发者可以实现自己的 AuthenticationProvider。
(7)PasswordEncoder
在Spring Security中,对密码的加密都是由PasswordEncoder来完成的。在Spring Security中,已经对PasswordEncoder有了很多实现,包括md5加密、SHA-256加密等,开发者只要直接拿来用就可以。在DaoAuthenticationProvider中,有一个就是PasswordEncoder属性,密码加密功能主要就靠它来完成。
在Spring的官方文档中明确指出,如果开发一个新的项目,BCryptPasswordEncoder是较好的选择。BCryptPasswordEncoder使用BCrypt的强散列哈希加密实现,并可以由客户端指定加密的强度,强度越高安全性自然就越高。本书示例正是使用BCryptPasswordEncoder进行加密。


您需要登录后才可以回帖 登录 | 加入联盟

本版积分规则

小黑屋|手机版|Archiver|疯狂Java联盟 ( 粤ICP备11094030号 )

GMT+8, 2018-12-13 02:33 , Processed in 0.201542 second(s), 6 queries , File On.

快速回复 返回顶部 返回列表