启用注解模式

在SpringSecurity配置类上添加@EnableGlobalMethodSecurity注解

用于启用SpringSecurity注解模式。默认SpringSecurity关闭全局注解模式

有三种注解模式,通过注解中的参数进行调配,分别是 secured JSR-250 prePost

securedEnabled 注解模式

启用方式:

@EnableGlobalMethodSecurity(securedEnabled=ture)

@Secured

可用注解:

JSR-250 注解模式

启用方式:

@EnableGlobalMethodSecurity(jsr250Enabled=ture)

RolesAllowed表示访问对应方法时所应该具有的角色。

其可以标注在类上,也可以标注在方法上,当标注在类上时表示其中所有方法的执行都需要对应的角色,

当标注在方法上表示执行该方法时所需要的角色,当方法和类上都使用了@RolesAllowed进行标注,则方法上的@RolesAllowed将覆盖类上的@RolesAllowed,

即方法上的@RolesAllowed将对当前方法起作用。@RolesAllowed的值是由角色名称组成的数组。

PermitAll表示允许所有的角色进行访问,也就是说不进行权限控制。

@PermitAll可以标注在方法上也可以标注在类上,当标注在方法上时则只对对应方法不进行权限控制,而标注在类上时表示对类里面所有的方法都不进行权限控制。

(1)当@PermitAll标注在类上,而@RolesAllowed标注在方法上时则按照@RolesAllowed将覆盖@PermitAll,即需要@RolesAllowed对应的角色才能访问。

(2)当@RolesAllowed标注在类上,而@PermitAll标注在方法上时则对应的方法也是不进行权限控制的。

(3)当在方法上同时使用了@PermitAll和@RolesAllowed时先定义的将发生作用,而都定义在类上时则是反过来的,即后定义的将发生作用
(这个没多大的实际意义,实际应用中不会有这样的定义)。

DenyAll是和PermitAll相反的,表示无论什么角色都不能访问。@DenyAll只能定义在方法上。

你可能会有疑问使用@DenyAll标注的方法无论拥有什么权限都不能访问,那还定义它干啥呢?

使用@DenyAll定义的方法只是在我们的权限控制中不能访问,脱离了权限控制还是可以访问的。

可用注解:

prePostEnabled 注解模式

启用方式:
@EnableGlobalMethodSecurity(prePostEnabled=ture)

可用注解:

@PreAuthorize 在方法调用之前,基于表达式的计算结果来限制对方法的访问

@PostAuthorize 允许方法调用,但是如果表达式计算结果为false,将抛出一个安全性异常

@PostFilter 允许方法调用,但必须按照表达式来过滤方法的结果

@PreFilter 允许方法调用,但必须在进入方法之前过滤输入值

Spring Security中定义了四个支持使用表达式的注解,分别是@PreAuthorize、@PostAuthorize、@PreFilter和@PostFilter。其中前两者可以用来在方法调用前或者调用后进行权限检查,后两者可以用来对集合类型的参数或者返回值进行过滤。

spring Security4种方法安全性的区别

使用@Secured注解方法,这是spring自带的注解方法。@Secured(””)内部的字符串不具有SpEL特性,只能是具体的权限。

使用@JSR-250 @RelosAllowed注解的方法。作用和使用方法与@Secured一样,不同在于它不是spring框架的,所以可以做到和spring框架的解耦。

使用Spring方法调用前和调用后注解方法。这些方法支持SpEL。匹配一个或多个明确声明的切点方法。

Spring Security 支持的所有SpEL表达式如下:

安全表达式 计算结果
authentication() 用户认证对象
denyAll() 结果始终为false
hasAnyRole(list of roles) 如果用户被授权指定的任意权限,结果为true
hasRole(role) 如果用户被授予了指定的权限,结果 为true
hasIpAddress(IP Adress) 用户地址
isAnonymous() 是否为匿名用户
isAuthenticated() 不是匿名用户
isFullyAuthenticated() 不是匿名也不是remember-me认证
isRemberMe() remember-me认证
permitAll() 始终true
principal() 用户主要信息对象
Oauth2 安全表达式 计算结果
oauth2.hasScope() 用户授权
oauth2.hasAnyScope() 用户有任何一个授权
oauth2.hasScopeMatching() 用户授权,正则匹配
oauth2.hasAnyScopeMatching() 用户有任何一个授权,正则匹配
oauth2.clientHasRole() 客户端有任何一个角色
oauth2.clientHasAnyRole() 客户端角色

autoApprove 在调用链中设置为 true 可以跳过认证,默认为 true

AuthorizationEndpoint 根据用户认证获得授权码,有下面两个方法:

/oauth/authorize - GET

/oauth/authorize - POST

TokenEndpoint 客户端根据授权码获取 token

/oauth/token - GET

/oauth/token - POST

CheckTokenEndpoint 可以用于远程解码令牌

/oauth/check_token

WhitelabelApprovalEndpoint 显示授权服务器的确认页。

/oauth/confirm_access

WhitelabelErrorEndpoint 显示授权服务器的错误页

/oauth/error

在官方的示例中,通过下面代码直接指定了视图:

registry.addViewController(“/oauth/confirm_access”).setViewName(“authorize”);
如果想跳过这个认证确认的过程,设置autoApprove 为true。