spring Security学习杂谈1

最近在学习spring Security,看了许多博客大牛著作,感觉这篇写的非常不错点击打开链接,把学到的东西做下总结回顾,顺便把遇到不错的学习资料链接发下大家一起学习。关于什么是spring Security大家可以去看链接,写的非常棒。

     理解学习spring Security的时候可以从两方面进行下手:鉴权(Authentication)和授权(Authorization)两方面进行下手。在我的理解中spring Security也是主要用来做鉴权和授权

进入学习之前,想简单说下一些API的使用,在文章中主要会围绕鉴权(Authentication)和授权(Authorization)来做讲解

1:简单API讲解说明(实际上除了一些配置的话也是主要围绕这些API进行的)【可以去看链接中内容,讲解很好

    (1):SecurityContextHold,主要目的是为使用者提供全局的SecurityContext

通过类的静态方法getContext(),可以获得的当前线程上的SecurityContext对象,请注意,这里是当前线程上的SecurityContext对象,这里的话SecurityContextHold是通过ThreadLocal将SecurityContext与线程进行绑定

    (2):SecurityContext:主要用于鉴权(Authentication)时候使用

SecurityContext就是当前环境的安全上下文,这个对象主要作用就是获取当前环境的Authentication。但是注意点,如果当前用户未鉴权的话,将会返回null【注意一点,未鉴权和匿名用户是两个概念

    (3):Authentication:主要提供两部分的信息,一个是用户的详细信息(Principal,UserDetails),另一个就是用户鉴权时候需要的信息

鉴权对象,该对象主要包含的内容主要有用户详细信息【userDetails】和用户鉴权时候需要的信息【用户名密码,token】。注意一点,Authentication是鉴权对象,但是具体鉴权操作并不是Authentication进行的。Authentication中还提供了一个列表的GrantedAuthority来表示用户具有的权限

    (4):GrantedAuthority:提供当前用户(UserDetails)所获得的系统内的授权

这个对象的话主要包含用户具有的权限信息,GrantedAuthority主要是由Authentication获取,但是在授权时候使用,由授权对象AccessDecisionManager来使用,并决定用户是否能够访问某些权限。

一般的GrantedAuthority是由用户所持有,我们一般会说用户具有什么样的权限或者角色。用的的信息由接口UserDetails来规范。

    (5):UserDetails:主要提供用户的信息

这个接口的话主要规范了用户字段。例如用户名,密码,账号是否锁定。获取当前用户的信息通常是通过SecurityContext——Authentication——UserDetails来获取。这个接口规定其实现类必须提供用户密码。

Spring Security并没有规定UserDetails以什么方式保存在持久层,也没有规定持久层是什么构成。只要能通过userDeatilsService提供userDetails就可以

    (6):UserDetailsService:这个接口的话主要是通过用户名查询,并返回用户的详细信息(UserDetails)

UserDetailsService只提供了一个loadUserByUsername方法,这个方法在用户健全的时候非常重要,譬如当用户登录时候提供用户名密码过来得时候,Security就是根据这个方法获取用户名密码进行比较,但是注意一点,比较是在AuthenticationManager以及AuthenticationProvider中进行比较的

但是当无法根据用户名称找到用户时候,会抛出UsernameNotFoundException异常,并不会返回null。

Spring Security提供了比较实用的两个实现方式:In-Memority实现,主要是负责从properties文件中读取用户信息并保存在内存中    ;另一个就是JdbcDaoImpl,负责从数据库中读取用户信息,但是JdbcImpl规定了数据库的Schema,所以一般也不会使用。如果使用JPA的话,就需要自己实现UserDetailsService了

2:Authentication(鉴权)与授权(Authorization)

    鉴权的意思就是鉴定用户是谁,授权(Authorization)就是判断用户是否拥有权限去做某件事情。从字面意思来理解的话,肯定是鉴权在授权之前,说到这里的话可能有些疑问了,如果没有用户去访问一些不需要授权的资源应该怎么办。这时候的话,会自动给你分配一个默认用户。

假设一个场景,当用户未登录,但是访问被Spring Security管辖的url【并且url被设置为任何用户都可以访问【permitALL】】时候,通过SecurityContextHolder.getContext().getAuthentication()获取当前用户,你将会获取一个匿名用户对象,通过Authentication.getName将会获得anonymousUser,而通过Authentication.getAuthorties()将会返回一个只有ROLE_ANONYMOUS单个元素的列表,这是匿名用户场景。

但是如果访问一个不是Spring Security管辖的URL时候,通过SecurityContextHolder.getContext().getAuthrntication()获取当前用户Authentication,将会返回null

这就是匿名用户与null的区别

3:Authentication(鉴权过程)





猜你喜欢

转载自blog.csdn.net/weixin_41818715/article/details/79519921