Spring Security应用开发(17)基于方法的授权(一)评估

Spring Security提供了4个用于方法的注解:

@PreAuthorize、@PostAuthorize、@PreFilter和@PostFilter。本文介绍前面2个注解。

@PreAuthorize

使用Spring Security的表达式来在方法执行之前控制允许执行某个方法。 如果表达式评估结果为false,则该方法不会被执行。@PreAuthorize的表达式通常是对方法的参数进行检查。

@PostAuthorize

使用Spring Security的表达式在方法执行之后控制是否允许某个方法正常返回。在该方法执行完毕后才评估表达式,如果评估结果为false,则该方法虽然被执行,但页面仍将不能正常访问。@PostAuthorize的表达式通常是对方法的返回值进行检查。

在Spring-security.xml文件中配置global-method-security结点的pre-post-annotations属性为enabled来启用方法级别的基于表达式的访问控制,以便在方法上使用上述4个注解。

<!-- 启用方法级别的基于表达式的访问控制 -->
<sec:global-method-security
 pre-post-annotations="enabled"
 />

本文使用@PreAuthorize注解来控制UserService类的addUser()方法只能被zhangsan这个用户使用。

(1)UserService类:

public class UserService {

@PreAuthorize("authentication.principal != null and ‘zhangsan‘ == authentication.principal.username")
public  void addUser(){
System.out.println("addUser called.");
}}

在@PreAuthorize注解的参数中是一个Spring 表达式,其中可以访问authentication对象,从而可以通过authentication.principal获取到当前登录的主体对象,此处为UserDetails。

如果使用zhangsan登录,则可以正常访问addUser方法,如果是其它用户,则不可以正常访问。

在这些注解的表达式中,除了可以访问Spring Security提供的hasRole()等安全表达式之外,还可以引用方法的参数,这需要使用Spring Data中提供的一个注解@Param,本文不会对此注解进行举例说明。

(2)配置UserService Bean。

 <beans:bean id="userService" class="com.test.service.UserService" />

(3)在HomeController中调用UserService的方法。

private UserService userService;

public UserService getUserService() {
return userService;
}

@Resource
public void setUserService(UserService userService) {
this.userService = userService;
}

@RequestMapping("/")
public ModelAndView  index(){
ModelAndView  mv = new ModelAndView();
mv.addObject("message", "Hello,welcome!");
mv.setViewName("home/index");
//addUser方法已进行授权控制。
this.userService.addUser();
return mv;
}

(4)启用基于方法的表达式。

<!-- 启用方法级别的基于表达式的访问控制 -->
<sec:global-method-security
 pre-post-annotations="enabled"
 />

(5)运行测试。

在使用zhangsan登录时,可以正常访问/home/页面。

在没有使用@PreAuthorize注解时,根据角色配置,使用wangwu访问/home页面。在使用了@PreAuthorize注解后,使用wangwu则不能正常访问。

时间: 2024-12-17 06:55:44

Spring Security应用开发(17)基于方法的授权(一)评估的相关文章

Spring Security应用开发(19)基于方法的授权(三)AOP

本文介绍使用AOP的配置方式来实现基于方法的授权. (1)首先使用Spring Security提供的protect-pointcut进行配置. protect-pointcut结点配置访问符合指定条件的方法锁需要的角色列表. <!-- 使用AOP的方式来定义方法级别的访问控制 --> <sec:global-method-security> <sec:protect-pointcut access="ROLE_USER,ROLE_ADMIN" expre

Spring Security应用开发(21)基于方法的授权(五)使用@Secured注解

Spring Security提供了@Secured注解来实现基于方法的授权控制. @Secured注解可以指定一个字符串数组参数作为value的值,表示当前用户具备这些角色中的任何一个角色即可满足授权条件. (1)启用@Secured注解. <sec:global-method-security secured-annotations="enabled" /> (2)使用Secured注解. //getUserByName()方法可以被具备ROLE_ADMIN或者ROLE

Spring Security应用开发(20)基于方法的授权(四)使用@RolesAllowed注解

Spring Security还提供了一种基于注解的方式来实现基于方法的授权.这就是本文介绍的@RolesAllowed注解.@RolesAllowed是JSR250定义的注解. (1)在spring-security.xml文件中启用JSR250注解支持. <!-- 启用JSR250支持:@RolesAllowed注解 --> <sec:global-method-security jsr250-annotations="enabled" /> (2)在需要授

Spring Security应用开发(18)基于方法的授权(二)过滤

本文将介绍@PreFilter和@PostFilter这两个注解. @PreFilter @PreFilter用于对方法的参数进行过滤.这种情况下参数通常是集合类型,符合条件的值被保留在集合中,不符合条件的从集合中移除.如果有多个集合类型的参数,需要使用@PreFilter的一个属性filterTarget来指定要过来的参数的名称. @PostFilter. @PostFilter用于对方法的结果进行过滤.这种情况下返回值通常是集合类型,符合条件的值被保留在集合中,不符合条件的从集合中移除. @

Spring Security应用开发(16)基于表达式的访问控制

1.1.1. 通用表达式 Spring Security 使用基于Spring EL的表达式来进行访问控制.内置的表达式如下表所示: 表达式 描述 hasRole(role) 当前主体(principal)是否支持role角色.支持则返回true hasAnyRole(role1,role2) 当前主体是否支持role1,role2中的任意一个角色. hasAuthority(authority) 跟hasRole(role)相似. hasAnyAuthority(authority1,auth

Spring Security应用开发(02)基于XML配置的用户登录

1.1. 基于XML配置的登录功能 经过一系列配置之后,可以使用Spring Security内置功能实现最基本的用户登录功能以及角色验证功能,这种内置的功能没有任何实用价值,仅仅用于了解Spring Security的工作方式. (1)配置web.xml. 主要是为Spring MVC和Spring Security提供一些入口,以便有机会进行Spring MVC以及Spring Security的初始化和过滤处理等工作. <servlet> <servlet-name>spri

Spring Security应用开发(14) 重要概念之授权相关概念

1.1.1. Secure Object Secure Object指的是一个Method Invovation 或者一个URL资源. 1.1.2. GrantedAuthority GrantedAuthority用于表达指定的用户获得的权限(即角色名称). public interface GrantedAuthority extends Serializable { //返回一个表达已经经过授权的字符串. //如果不符合授权条件则返回null. String getAuthority();

Spring Security OAuth2 开发指南。

官方原文:http://projects.spring.io/spring-security-oauth/docs/oauth2.html 翻译及修改补充:Alex Liao. Spring OAuth2.0 提供者实现原理: Spring OAuth2.0提供者实际上分为: 授权服务 Authorization Service. 资源服务 Resource Service. 虽然这两个提供者有时候可能存在同一个应用程序中,但在Spring Security OAuth中你可以把 他它们各自放在

Spring Security 4 Hello World 基于注解 和 XML 例子(带源码)

下一篇: Spring Security 4 自定义登录表单 注解和XML例子 原文:http://websystique.com/spring-security/spring-security-4-hello-world-annotation-xml-example/ [已翻译文章,点击分类里面的spring security 4进行查看] [翻译by 明明如月 QQ 605283073] 本教程演示Spring MVC web项目中Spring Security 4的用法.通过url对访问进