在Spring Security中之前通过在配置类中针对不同的访问路径有不同的权限,现在可以直接在方法上通过注解来配置访问不同的路径所需要的权限。
首先在配置中添加方法安全注解
Spring Security默认是禁用注解的,要想开启注解, 需要在继承WebSecurityConfigurerAdapter的类上加@EnableGlobalMethodSecurity注解, 来判断用户对某个控制层的方法是否具有访问权限 。
prePostEnabled:执行方法的前后进行安全验证
securedEnabled:创建一个切点,这样的话Spring Security切面就会包装带有@Secured注解的方法
@EnableGlobalMethodSecurity(prePostEnabled = true,securedEnabled = true)
业务类
@PreAuthorize(“hasRole(‘admin’)”):执行该方法需要有admin权限
@Secured(“ROLE_user”):执行该方法需要user权限
@PreAuthorize(“hasAnyRole(‘admin’,‘user’)”):需要admin或者user权限
package org.javaboy.security.service;
import org.springframework.security.access.annotation.Secured;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Service;
@Service
public class MethodService {
@PreAuthorize("hasRole('admin')")
public String admin() {
return "hello admin";
}
@Secured("ROLE_user")
public String user() {
return "hello user";
}
@PreAuthorize("hasAnyRole('admin','user')")
public String hello() {
return "hello hello";
}
}
接口:
针对service的三个方法提供三个不同的接口
package org.javaboy.security.controller;
import org.javaboy.security.service.MethodService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "hello security";
}
@GetMapping("/admin/hello")
public String admin() {
return "hello admin!";
}
@GetMapping("/user/hello")
public String user() {
return "hello user!";
}
@GetMapping("/login")
public String login() {
return "please login!";
}
@Autowired
private MethodService methodService;
@GetMapping("/hello1")
public String hello1() {
return methodService.admin();
}
@GetMapping("/hello2")
public String hello2() {
return methodService.user();
}
@GetMapping("/hello3")
public String hello3() {
return methodService.hello();
}
}
分别用两个用户测试这三个接口:
首先登陆javaboy用户
分别对三个接口测试:
hello需要的权限是admin,javaboy用户具有admin权限所以可以访问
测试第二个接口hello2
由于hello2需要权限user,而javaboy用户不具备,所以不能访问
第三个接口hello3
hello3接口admin和user权限都可以访问,javaboy用户有admin权限所以可以访问。
来源:CSDN
作者:YRZ-James
链接:https://blog.csdn.net/qq_41998938/article/details/104197452