Spring Security权限控制方式
Spring Security作为一个专注于为Java应用程序提供身份验证和授权的框架,除了自身提供的默认权限控制,还可以通过扩展以满足自定义要求;以下从服务器端和页面端两方面开启权限控制;
服务器端权限控制
在服务器端我们可以通过Spring security提供的注解对方法来进行权限控制,支持三种类型的注解,JSR-250注解、@Secured注解和支持表达式的注解,这三种注解默认都是没有启用的,需要单独通过global-method-security元素的对应属性进行启用;
开启注解使用
- 配置文件
<security:global-method-security jsr250-annotations="enabled"/>
<security:global-method-security secured-annotations="enabled"/>
<security:global-method-security pre-post-annotations="disabled"/>
- 注解开启
@EnableGlobalMethodSecurity :Spring Security默认是禁用注解的,所以需要我们手动开启;在@Configuration实例上使用 @EnableGlobalMethodSecurity 注解来启用全局方法权限控制;
@Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
@Target(value = { java.lang.annotation.ElementType.TYPE })
@Documented
@Import({ GlobalMethodSecuritySelector.class })
@EnableGlobalAuthentication
@Configuration
public @interface EnableGlobalMethodSecurity {
//基于表达式进行方法访问控制
boolean prePostEnabled() default false;
//基于 @Secured 注解
boolean securedEnabled() default false;
//基于 JSR-250 注解
boolean jsr250Enabled() default false;
boolean proxyTargetClass() default false;
int order() default Ordered.LOWEST_PRECEDENCE;
}
通过@EnableGlobalMethodSecurity 源码我们可以看到,提供了三种方式:jsr250Enabled、securedEnabled、prePostEnabled,接下来就是使用他们啦;
JSR-250 注解
- @RolesAllowed:指允许指定角色访问方法
//示例
@RolesAllowed({"ROLE_ADMIN"}) 该方法只要具有"ADMIN"权限的用户可以访问此方法
//可以省略前缀ROLE_
@RolesAllowed({"ADMIN"})
-
@PermitAll:允许所有角色进行访问,等于没有进行权限控制
-
@DenyAll:和PermitAll相反,表示无论什么角色都不能访问
@Secured 注解
@Secured注解默认值为disabled;
//示例
@Secured("IS_AUTHENTICATED_ANONYMOUSLY")
public Account readAccount(Long id);
@Secured("ROLE_TELLER")
支持表达式访问注解
-
@PreAuthorize :在方法调用之前,基于表达式计算结果来限制对方法的访问,先执行表达式判断,再执行方法;
-
@PostAuthorize:允许方法调用,但是如果表达式计算结果为false,将抛出一个安全性异常,先执行方法后执行表达式;
-
@PostFilter: 允许方法调用,但必须按照表达式来过滤方法的结果,即在执行结果返回前过滤;
-
@PreFilter: 允许方法调用,但必须在进入方法之前过滤输入值;基于入参进行过滤,入参前过滤;入参必须为 java.util.Collection 且支持 remove(Object) 的参数。如果有多个集合需要通过 filterTarget=<参数名> 来指定过滤的集合
@PreAuthorize 和 @PostAuthorize 侧重于方法调用的控制;@PreFilter 和 @PostFilter 侧重于数据的控制,使用@PreFilter和@PostFilter可以对集合类型的参数或返回值进行过滤;
页面端标签控制权限
在jsp页面中我们可以使用spring security提供的权限标签进行权限控制
导入Mven
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>version</version>
</dependency>
页面导入
<%@taglib uri="http://www.springframework.org/security/tags" prefix="security"%>
authentication
<security:authentication property="" htmlEscape="" scope="" var=""/>
-
property: 只允许指定Authentication所拥有的属性,可以进行属性的级联获取,如“principle.username”,
不允许直接通过方法进行调用 -
htmlEscape:表示是否需要将html进行转义。默认为true。
-
scope:与var属性一起使用,用于指定存放获取的结果的属性名的作用范围,默认我pageContext。Jsp中拥
有的作用范围都进行进行指定 -
var: 用于指定一个属性名,这样当获取到了authentication的相关信息后会将其以var指定的属性名进行存
放,默认是存放在pageConext中
accesscontrollist
//hasPermission="" domainObject="" 这两个属性必须指定
<security:accesscontrollist hasPermission="" domainObject="" var=""></security:accesscontrollist>
- hasPermission:hasPermission属性用于指定以逗号分隔的权限列表;
- domainObject:domainObject用于指定对应的域对象
- var:var则是用以将鉴定的结果以指定的属性名存入pageContext中,以供同一页面的其它地方使用