Spring Security权限控制方式

  • 服务器端权限控制
  • 开启注解使用
  • JSR-250 注解
  • @Secured 注解
  • 支持表达式访问注解
  • 页面端标签控制权限
  • 导入Mven
  • authentication
  • accesscontrollist



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中,以供同一页面的其它地方使用