Permission

Permission 是 Java 中的一个权限类,用来表示对资源的访问权限。Permission 最重要的方法是 implies,方法签名如下:

public abstract boolean implies(Permission permission);

表示当前Permission对象 (this) 是否暗含了指定 Permission 对象(permission) 的权限。

Java 中给出一个经典实现:BasicPermission,它使用了传入的字符串作为权限的标志,并使用类似于相对路径的办法比较一个 Permission 是否暗含了另一个Permission 的权限。

举个例子说明其含义:

import java.security.BasicPermission;
import java.security.PermissionCollection;


public class TestBasicPermission {

	public TestBasicPermission() {
		// TODO Auto-generated constructor stub
	}
	
	public static void main(String[] args)
	{
		testPermission();
	}
	
	public static void testPermission()
	{
		MyPermission usaBp = new MyPermission("usa.*");	//全美国
		MyPermission chinaBp = new MyPermission("china.*");	//全中国
		MyPermission hubeiBp = new MyPermission("china.hubei.*"); //全湖北省
		MyPermission wuhanBp = new MyPermission("china.hubei.wuhan.*");	//全武汉市
		MyPermission wuchangBp = new MyPermission("china.hubei.wuhan.wuchang.*");	//全武昌区	
		
		System.out.println(chinaBp.implies(usaBp));	//false ,全美国并不暗含全中国
		System.out.println(hubeiBp.implies(wuchangBp));	//true ,全湖北暗含了全武昌
		System.out.println(hubeiBp.implies(chinaBp));	//false ,全湖北并不暗含全中国
		
		PermissionCollection bpc = usaBp.newPermissionCollection();
		bpc.add(chinaBp); 
		System.out.println(bpc.implies(hubeiBp));	//true , (全美国 | 全中国)暗含了全湖北
	}
}

//BasicPermission 是个虚类不能直接使用,故要先派生出一个具现类
class MyPermission extends BasicPermission
{
	public MyPermission(String name) {
		super(name);
		// TODO Auto-generated constructor stub
	}
	private static final long serialVersionUID = 1L;
}
从例子中,还可以看出,Java 对于权限还给出一个权限集合类:PermissionCollection,它是一组权限的并集,对任意给定的 Permission 进行测试权限,只要被这个集合中的任意一个 Permission 暗含即可。需要注意的是,该集合中只能是同种类型的 Permission

在 Spring Boot 中,`@Permission` 注解并不是 Spring 框架原生提供的,而是通常结合 Apache Shiro 或其他权限管理框架使用的一种自定义注解,用于实现方法级别的权限控制。通过该注解,可以对特定的方法进行权限校验,只有拥有指定权限的用户才能调用该方法。 ### 使用 `@Permission` 注解的基本流程 在实际应用中,`@Permission` 注解的使用通常需要以下几个步骤: 1. **定义注解** 首先需要定义一个自定义注解,例如 `@Permission`,用于标识方法需要的权限字符串。 ```java @Target({ElementType.PARAMETER, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Permission { String[] value(); } ``` 2. **实现权限校验逻辑** 在 Shiro 的 `AuthorizingRealm` 中重写 `isPermitted` 方法,将用户权限信息与注解中声明的权限进行比对,判断是否允许访问。 ```java @Override protected boolean isPermitted(Permission permission, AuthorizationInfo info) { Collection<Permission> perms = getPermissions(info); if (perms != null && !perms.isEmpty()) { for (Permission perm : perms) { if (perm.implies(permission)) { return true; } } } return false; } ``` 3. **在控制器或服务层使用注解** 在需要进行权限控制的方法上添加 `@Permission` 注解,并传入对应的权限字符串。 ```java @RestController @RequestMapping("/users") public class UserController { @Permission("user:view") @GetMapping("/{id}") public User getUser(@PathVariable Long id) { // 只有拥有 "user:view" 权限的用户才能访问此方法 return userService.findById(id); } } ``` 4. **集成 AOP 进行权限拦截** 使用 Spring AOP 拦截带有 `@Permission` 注解的方法,并在调用前进行权限验证。 ```java @Aspect @Component public class PermissionAspect { @Before("@annotation(permission)") public void checkPermission(JoinPoint joinPoint, Permission permission) { String[] requiredPermissions = permission.value(); // 调用 Shiro 的权限校验逻辑 Subject currentUser = SecurityUtils.getSubject(); for (String perm : requiredPermissions) { if (!currentUser.isPermitted(perm)) { throw new AuthorizationException("没有权限访问该资源"); } } } } ``` 通过上述方式,可以在 Spring Boot 应用中实现基于 `@Permission` 注解的权限控制机制,结合 Apache Shiro 提供的权限管理能力,实现细粒度的方法级权限控制[^1]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值