Shiro之UnauthorizedException

org.apache.shiro.authz.UnauthorizedException: Subject does not have permission [/keywordPending/delete]

今天增加表格中的行按钮时报的bug,权限配置问题,自定义权限没有得到认证。很明显,我在keywordPending 后加了一个delete,这个让系统以为这是一个新权限,而且没有找到授权的地方,所以直接报错,没有此权限。

HTML中代码: shiro.hasPermission("/keywordPending/update")
这个是权限认证代码,如果有括号中的权限,才会显示,但很明显,我现在没有这个权限,所以这个权限是在哪里赋予的呢?经过我查阅资料找到了Shiro支持的三种授权方式:

- 编程式:通过写if/else授权代码块完成:
Subject subject =SecurityUtils.getSubject();
if(subject.hasRole(“admin”)) 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Shiro 是一个 Java 安全框架,提供了身份认证、授权、加密等安全功能,可以帮助开发者快速构建安全可靠的应用程序。以下是一个使用 Shiro 框架的简单示例: 1. 引入 Shiro 依赖: ```xml <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.7.1</version> </dependency> ``` 2. 配置 Shiro: ```java // 创建 SecurityManager DefaultSecurityManager securityManager = new DefaultSecurityManager(); // 设置 Realm securityManager.setRealm(new MyRealm()); // 将 SecurityManager 设置到 SecurityUtils 中 SecurityUtils.setSecurityManager(securityManager); ``` 3. 自定义 Realm: ```java public class MyRealm extends AuthorizingRealm { // 在 Realm 中实现身份认证逻辑 @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { // 获取用户名和密码 String username = (String) token.getPrincipal(); String password = new String((char[]) token.getCredentials()); // 根据用户名查询用户信息 User user = userRepository.findByUsername(username); // 判断用户是否存在 if (user == null) { throw new UnknownAccountException("用户名不存在"); } // 校验密码 if (!password.equals(user.getPassword())) { throw new IncorrectCredentialsException("密码错误"); } // 返回身份认证信息 return new SimpleAuthenticationInfo(user, password, getName()); } // 在 Realm 中实现授权逻辑 @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { // 获取当前登录用户信息 User user = (User) principals.getPrimaryPrincipal(); // 查询用户角色和权限信息 List<Role> roles = roleRepository.findByUserId(user.getId()); List<Permission> permissions = permissionRepository.findByUserId(user.getId()); // 创建授权信息对象 SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); // 添加角色和权限信息 for (Role role : roles) { authorizationInfo.addRole(role.getName()); } for (Permission permission : permissions) { authorizationInfo.addStringPermission(permission.getName()); } // 返回授权信息 return authorizationInfo; } } ``` 4. 在 Controller 中使用 Shiro: ```java @Controller public class UserController { @RequiresAuthentication @GetMapping("/users/{id}") public String getUser(@PathVariable Long id, Model model) { // 获取当前登录用户信息 User user = (User) SecurityUtils.getSubject().getPrincipal(); // 判断当前用户是否有查看用户信息的权限 if (!SecurityUtils.getSubject().isPermitted("user:view:" + id)) { throw new UnauthorizedException("没有权限查看用户信息"); } // 查询用户信息 User targetUser = userRepository.findById(id); // 将用户信息放入 Model 中 model.addAttribute("user", targetUser); // 返回模板页面 return "user"; } } ``` 以上示例演示了如何使用 Shiro 实现身份认证和授权功能,在 Controller 中使用 Shiro 进行权限控制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值