Shiro系列十二:权限注解

@RequiresAuthentication:表示当前Subject已经通过login 进行了身份验证;即 Subject. isAuthenticated() 返回 true。
@RequiresUser:表示当前 Subject 已经身份验证或者通过记住我登录的。
@RequiresGuest:表示当前Subject没有身份验证或通过记住我登录过,即是游客身份。
@RequiresRoles(value={“admin”, “user”}, logical= Logical.AND):表示当前 Subject 需要 admin 和 user 角色。
@RequiresPermissions (value={“user:a”, “user:b”}, logical= Logical.OR):表示当前 Subject 需要 user:auser:b 权限。

测试:
1、创建类ShiroService

public class ShiroService {
	
	public void testMethod(){
		System.out.println("testMethod, time: " + new Date());
	}
	
}

2、在Spring配置文件中配置bean

<bean id="shiroService"
    	class="com.atguigu.shiro.services.ShiroService"></bean>

3、创建接口shiro/testShiroAnnotation。添加权限注解 @RequiresRoles({"admin"})

@Controller
@RequestMapping("/shiro")
public class ShiroHandler {
	
	@Autowired
	private ShiroService shiroService;
	
	@RequiresRoles({"admin"})
	@RequestMapping("/testShiroAnnotation")
	public String testShiroAnnotation(){
		shiroService.testMethod();
		return "redirect:/list.jsp";
	}

}

结果:
 当登录的用户有admin角色时,可以正常访问,否则抛异常:

org.apache.shiro.authz.UnauthorizedException: Subject does not have role [admin]

 对于异常可以使用 spring 的声明式异常,使用注解 @ExceptionHandler 和 @ControllerAdvice 对异常进行统一处理。

 注意:在Service方法上一般都会使用注解 @Transactional,使得在方法开始的时候会有事务,这个时候Service已经是一个代理对象,这时权限注解就不能加到 Service上,会发生类型转换异常。需要加到Controller上,因为不能够让 Service 成为代理的代理。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Shiro中的`@RequiresPermissions`注解来进行URL级别的权限控制,当用户访问该URL时,会进行相应的权限验证。如果没有相应的权限,则无法访问该URL。 以下是一个使用Java语言编写的自定义URL权限注解的示例: ```java import org.apache.shiro.authz.annotation.RequiresPermissions; import java.lang.annotation.*; /** * 自定义URL权限注解 */ @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented @RequiresPermissions(value = {"url:read"}) public @interface UrlPermission { /** * 权限名称 */ String name() default ""; } ``` 在该示例中,我们自定义了一个`@UrlPermission`注解,用于对URL进行权限控制。注解中使用了Shiro中的`@RequiresPermissions`注解,并且指定了权限名称为`url:read`。 使用时,只需要在需要进行权限控制的Controller类或方法上添加`@UrlPermission`注解即可。 ```java @Controller @RequestMapping("/url") public class UrlController { @RequestMapping(value = "/read", method = RequestMethod.GET) @UrlPermission(name = "查看URL") public String read() { return "read"; } @RequestMapping(value = "/write", method = RequestMethod.GET) @UrlPermission(name = "修改URL") public String write() { return "write"; } } ``` 在上述示例中,我们分别为`/url/read`和`/url/write`两个URL添加了`@UrlPermission`注解,并且指定了不同的权限名称。 使用该注解进行URL级别的权限控制,可以有效保护系统的安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值