五 spring security 其他权限检验及自定义校验方法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了五 spring security 其他权限检验及自定义校验方法相关的知识,希望对你有一定的参考价值。
参考技术A 我们前面都是使用@PreAuthorize注解,然后在在其中使用的是hasAuthority方法进行校验。除此之外,spring security还为我们提供了其它方法例如:hasAnyAuthority,hasRole,hasAnyRole等。hasAuthority原码:
hasAuthority方法底层是执行了SecurityExpressionRoot类的hasAuthority方法,它内部其实是调用authentication的getAuthorities方法获取用户的权限列表,然后判断我们传入的参数是否在权限列表中。
hasAnyAuthority方法可以传入多个权限,只要用户有其中任意一个权限都可以访问对应资源。
hasRole要求有对应的角色才可以访问,但是它内部会把我们传入的参数拼接上 ROLE_ 后再去比较,所以这种情况下要求用户对应的权限也要有 ROLE_ 这个前缀才可以。
hasAnyRole有任意的角色就可以访问,它内部也会把我们传入的参数拼接上 ROLE_ 后再去比较,所以这种情况下也要求用户对应的权限也要有 ROLE_ 这个前缀才可以。
自定义自己的权限校验方法
在SPEL表达式中使用 @ex相当于获取容器中bean的名字为ex的对象,然后再调用这个对象的hasAuthority方法
我们也可以在配置类中使用使用配置的方式对资源进行权限控制
Spring Security +Oauth2 +Spring boot 动态定义权限
Oauth2介绍:Oauth2是为用户资源的授权定义了一个安全、开放及简单的标准,第三方无需知道用户的账号及密码,就可获取到用户的授权信息,并且这是安全的。
简单的来说,当用户登陆网站的时候,需要账号和密码,但是你没有账号和密码,你需要注册网站的账号和密码,可是你不想注册,如果我有(qq,github,微博,facebook)第三方网站的账号,直接登陆当前网站访问网站的资源就好了?有没有这种实现呢?
答案是yes,当然为统一规范,其中就用到 oauh2。
ouah2有4中实现模式(参考阮一峰的 http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html)
(1)授权码模式
用户访问网站登陆的时候,选择qq登陆,facebook登陆,或者微博登陆的时候,网站将你导入qq,facebook,微博的登陆页面(也就是认证服务器)输入账号和密码,当授权成功时,将获取唯一的授权码(Auth code),然后客户端拿到这个Auth code附上早先的重定向url,向认qq,facebook,请求token,向认证服务器(qq,facebook)提交的请求头核对授权码和重定向url,确认无误,返回token和更新令牌
(2)密码模式
用户向客户端提高自己的账号和密码。客户端使用这些信息,向服务器提供商索要授权码,认证服务器认证通过以后,返回令牌,用户通过令牌就可以访问网站的资源
(3)简易模式
不通过第三方应用程序的服务器,直接在浏览器中向认证服务器索要令牌,跳过授权码这个步骤。
(4)客户端模式
指客户端以自己的名义,而不是以用户的名义,向"服务提供商"进行认证。严格地说,客户端模式并不属于OAuth框架所要解决的问题。在这种模式中,用户直接向客户端注册,客户端以自己的名义要求"服务提供商"提供服务,其实不存在授权问题。
Spring Security介绍:
Spring Security是一个专注于为Java应用程序提供身份验证和授权的框架,使用内部使用Servlet过滤器对url的请求进行过滤,并且在应用程序处理该请求之前进行某些安全处理。 Spring Security提供有若干个过滤器,它们能够拦截Servlet请求,并将这些请求转给认证和访问决策管理器处理,从而增强安全性。根据自己的需要,可以使用适当的过滤器来保护自己的应用程序。
Spring Security 与oath2自定义权限控制
以上是关于五 spring security 其他权限检验及自定义校验方法的主要内容,如果未能解决你的问题,请参考以下文章
Spring Security源码:权限访问控制是如何做到的?
Spring Security源码:权限访问控制是如何做到的?