spring security method security
参考
Spring Security 官方文档
http://www.concretepage.com/spring/spring-security/preauthorize-postauthorize-in-spring-security
方法调用安全
对应的注解@EnableGlobalMethodSecurity,该注解放在GlobalMethodSecurityConfiguration的子类上方
@EnableGlobalMethodSecurity(prePostEnabled = true)
使用的Voter
org.springframework.security.access.prepost.PreInvocationAuthorizationAdviceVoter
有俩对对应的注解
@PreAuthorize 决定方法是否可以被调用
@PostAuthorize 决定方法是否可以返回该值
@PreFilter
@PostFilter
如下:
package com.jiangchong.methodsecurity; import org.springframework.security.access.method.P;
import org.springframework.security.access.prepost.PostAuthorize;
import org.springframework.security.access.prepost.PreAuthorize; public interface IBookService
{
@PreAuthorize("hasRole('ROLE_ADMIN')")
public void addBook(Book book); // PostAuthorize,决定这个值是否可以被返回,使用returnObject
/*
* Less commonly, you may wish to perform an access-control check after the
* method has been invoked. This can be achieved using the @PostAuthorize
* annotation. To access the return value from a method, use the built-in
* name returnObject in the expression.
*/
@PostAuthorize("returnObject.owner == authentication.name")
public Book getBook(); // PreAuthorize,决定这个方法是否可以被调用
/*
* @P单个参数的方法
*/
@PreAuthorize("#b.owner == authentication.name")
public void deleteBook(@P("b") Book book);
/*
* @Param放在至少有一个参数的方法的上
*
* @PreAuthorize("#n == authentication.name") Contact
* findContactByName(@Param("n") String name)
*/
// springEL
/*
* @PreAuthorize("#contact.name == authentication.name") public void
* doSomething(Contact contact);
*/ }
测试的Demo,基于Spring Boot
Pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.jiangchong</groupId>
<artifactId>methodsecurity</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging> <name>methodsecurity</name>
<url>http://maven.apache.org</url> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.2.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
</dependency>
</dependencies>
</project>
App.class
package com.jiangchong.methodsecurity; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; /**
*
*/
@RestController
@SpringBootApplication
public class App
{
@Autowired
public IBookService bookService; public static void main(String[] args)
{
SpringApplication.run(App.class, args);
} @RequestMapping("/")
public Map<String, String> test()
{
Book b1 = new Book("A", "admin");
bookService.addBook(b1);
bookService.getBook();
System.out.println("user return");
Book b2 = new Book("B", "user");
bookService.deleteBook(b2);
return null;
}
/*
* @RequestMapping("/admin") public Map<String, String> testAdmin() {
* Map<String, String> map = new HashMap<>(); map.put("admin", "admin");
* return map; }
*
* @RequestMapping("/user") public Map<String, String> testUser(String name)
* { Map<String, String> map = new HashMap<>(); map.put("user", "user");
* return map; }
*
* @RequestMapping("/resource/test") public Map<String, String>
* testResouce() { Map<String, String> map = new HashMap<>();
* map.put("test", "resource"); return map; }
*/
}
Book.class
package com.jiangchong.methodsecurity; public class Book
{
private String name;
private String owner; public Book(String name, String owner)
{
this.name = name;
this.owner = owner;
} public String getName()
{
return name;
} public void setName(String name)
{
this.name = name;
} public String getOwner()
{
return owner;
} public void setOwner(String owner)
{
this.owner = owner;
}
}
BookService.class
package com.jiangchong.methodsecurity; import org.springframework.stereotype.Service; @Service
public class BookService implements IBookService
{
@Override
public void addBook(Book book)
{
System.out.println("You have successfully added book.");
} @Override
public Book getBook()
{
Book book = new Book("B", "user");
System.out.println("return " + book.getOwner());
return book;
} @Override
public void deleteBook(Book book)
{
System.out.println("Books deleted");
} }
IBookService
package com.jiangchong.methodsecurity; import org.springframework.security.access.method.P;
import org.springframework.security.access.prepost.PostAuthorize;
import org.springframework.security.access.prepost.PreAuthorize; public interface IBookService
{
@PreAuthorize("hasRole('ROLE_ADMIN')")
public void addBook(Book book); // PostAuthorize,决定这个值是否可以被返回,使用returnObject
/*
* Less commonly, you may wish to perform an access-control check after the
* method has been invoked. This can be achieved using the @PostAuthorize
* annotation. To access the return value from a method, use the built-in
* name returnObject in the expression.
*/
@PostAuthorize("returnObject.owner == authentication.name")
public Book getBook(); // PreAuthorize,决定这个方法是否可以被调用
/*
* @P单个参数的方法
*/
@PreAuthorize("#b.owner == authentication.name")
public void deleteBook(@P("b") Book book);
/*
* @Param放在至少有一个参数的方法的上
*
* @PreAuthorize("#n == authentication.name") Contact
* findContactByName(@Param("n") String name)
*/
// springEL
/*
* @PreAuthorize("#contact.name == authentication.name") public void
* doSomething(Contact contact);
*/ }
MethodSecurityConfig
package com.jiangchong.methodsecurity; import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.method.configuration.GlobalMethodSecurityConfiguration; @Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration
{
protected void configure(AuthenticationManagerBuilder auth)
throws Exception
{
auth.inMemoryAuthentication();
} }
WebSecurityConfig
package com.jiangchong.methodsecurity; import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; @Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter
{
protected void configure(HttpSecurity http) throws Exception
{
http.authorizeRequests().anyRequest().authenticated().and().formLogin()
.loginProcessingUrl("/login").permitAll();
} public void configure(WebSecurity web) throws Exception
{
web.ignoring().antMatchers("/resource/**");
} protected void configure(AuthenticationManagerBuilder auth)
throws Exception
{
auth.inMemoryAuthentication().withUser("admin").password("admin")
.roles("ADMIN").and().withUser("user").password("user")
.roles("USER");
} }
Book b1 = new Book("A", "admin");
bookService.addBook(b1);
bookService.getBook();
System.out.println("user return");
Book b2 = new Book("B", "user");
bookService.deleteBook(b2);
这些调用序列,只要有一个不满足权限,后面的方法不会再调用
spring security method security的更多相关文章
- Spring Security 4 Method security using @PreAuthorize,@PostAuthorize, @Secured, EL--转
原文地址:http://websystique.com/spring-security/spring-security-4-method-security-using-preauthorize-pos ...
- 初识Spring security-添加security
请先查看 初识Spring security-无Security的SpringMVC 在pom.xml文件中添加包 <!-- Spring Security --> <depende ...
- Spring Security(二十二):6.4 Method Security
From version 2.0 onwards Spring Security has improved support substantially for adding security to y ...
- Spring Security(十七):5.8 Method Security
From version 2.0 onwards Spring Security has improved support substantially for adding security to y ...
- Spring boot Security Disable security
When I use security.basic.enabled=false to disable security on a Spring Boot project that has the fo ...
- 41.4 Method Security方法安全性
41.4.1 <global-method-security> 这个元素是为Spring Security beans上的安全方法添加支持的主要手段.可以通过使用注释(在接口或类级别定义) ...
- spring boot + thymeleaf +security自定义规则 的简单使用
1.前言 以前开发一直使用 springMVC模式开发 ,前端页面常使用 JSP ,现在html5淘汰了 ,要么使用html ,要么使用vue , 现在使用spring boot ,有必要总结一下 ...
- 【JavaEE】SSH+Spring Security自定义Security的部分处理策略
本文建立在 SSH与Spring Security整合 一文的基础上,从这篇文章的example上做修改,或者从 配置了AOP 的example上做修改皆可.这里主要补充我在实际使用Spring Se ...
- Spring Cloud:Security OAuth2 自定义异常响应
对于客户端开发或者网站开发而言,调用接口返回有统一的响应体,可以针对性的设计界面,代码结构更加清晰,层次也更加分明. 默认异常响应 在使用 Spring Security Oauth2 登录和鉴权失败 ...
随机推荐
- java eclipse环境搭建环境
开发环境搭建: JDK的安装 http://www.oracle.com/technetwork/java/javase/downloads 下载文件:jdk-8u101-windows-x64.ex ...
- UE4 - C++ 射线捕捉
#include "Runtime/Engine/Classes/Kismet/KismetMathLibrary.h" //省略大部分代码 void AMyFPS_Charact ...
- JQuery源码解析(十)
默认回调对象设计 不传入任何参数,调用add的时候将函数add到内部的list中,调用fire的时候顺序触发list中的回调函数: function fn1(val) { console.log('f ...
- Android关联源码support-v4,v7,v13源码(转)
在Android实际开发过程中往往会遇到使用v4,v7或v13兼容包中的一些类如ViewPager,Fragment等,但却无法关联源码. 在网上搜索之后,有很多办法,这里只向大家介绍一种,我用的觉得 ...
- ibatis批量操作补充
ibatis批量操作 这文章的补充吧. review代码的时候发现一个页面应用排序设置功能,原先代码中,进行了循环update实现.虽然应用较少,不过无谓浪费数据库链接实在不是一个好的想法. 所以, ...
- 在线聊天室的实现(1)--websocket协议和javascript版的api
前言: 大家刚学socket编程的时候, 往往以聊天室作为学习DEMO, 实现简单且上手容易. 该Demo被不同语言实现和演绎, 网上相关资料亦不胜枚举. 以至于很多技术书籍在讲解网络相关的编程时, ...
- Erlang 101 Erlang环境和顺序编程
笔记系列 Erlang环境和顺序编程 Erlang并发编程 Erlang分布式编程 Yaws Erlang/OTP 日期 变更说明2014-10-12 A outline, ...
- C++ Primer : 第十三章 : 拷贝控制之对象移动
右值引用 所谓的右值引用就是必须将引用绑定到右值的引用,我们通过&&来绑定到右值而不是&, 右值引用只能绑定到即将销毁的对象.右值引用也是引用,因此右值引用也只不过是对象的别名 ...
- gradle 命令
gradle -v gradle clean gralde build gradle assembleDebug gradle assembleRelease gradle clean --refre ...
- asp.net 设置页面的默认按钮(敲回车按钮所触发的默认按钮)
来源:http://blog.csdn.net/zanychou/article/details/6128872 设置一个页面的默认按钮主要代码: this.Page.Form.DefaultButt ...