shiro@RequiresPermission的设置

本文详细介绍了如何在Java项目中使用Shiro框架进行权限和角色管理,包括自定义Realm实现用户认证和授权,以及在Controller层使用@RequiresPermissions注解进行权限检查。
public class MyShiroRealm extends AuthorizingRealm {
    //slf4j记录日志,可以不使用
    private Logger logger = LoggerFactory.getLogger(MyShiroRealm.class);
 
    /**
     * 设置授权信息
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        logger.info("开始授权(doGetAuthorizationInfo)");
        SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
        HttpServletRequest request = (HttpServletRequest) ((WebSubject) SecurityUtils
                .getSubject()).getServletRequest();//这个可以用来获取在登录的时候提交的其他额外的参数信息
        String username = (String) principals.getPrimaryPrincipal();//这里是写的demo,后面在实际项目中药通过这个登录的账号去获取用户的角色和权限,这里直接是写死的
        //受理权限
        //角色
        Set<String> roles = new HashSet<String>();
        roles.add("role1");
        authorizationInfo.setRoles(roles);
        //权限
        Set<String> permissions = new HashSet<String>();
        permissions.add("user:list");      
        //permissions.add("user:add");
----//下面便是对@RequiresPermission授权,这里写死权限为"user:list";也可以是通过查询数据库,匹配相对应的权限。

authorizationInfo.setStringPermissions(permissions);
return authorizationInfo;
    }
 
    /**
     * 设置认证信息
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(
          .....
    }
    
}

Controller:

Controller
@RequestMapping("/user")
public class UserController {
    Logger logger = LoggerFactory.getLogger(UserController.class);
    @RequiresPermissions("user:list")//这个是配置是否有该权限的,如果是按上面的写法,这个是有权限的
    @RequestMapping(value="/list",method=RequestMethod.GET)
    public String getList(){
        logger.info("进入用户列表");
        return "user/list";
    }
    @RequiresPermissions(value={"user:add"})//这个是没有权限的
    @RequestMapping(value="/add",method=RequestMethod.GET)
    public String getAdd(){
        logger.info("进入新增用户界面");
        return "user/add";
    }
    
}

 

转载于:https://www.cnblogs.com/leeego-123/p/10721485.html

使用Shiro后`@Cacheable`注解不生效可能有以下原因及对应的解决办法: ### 原因一:AOP代理关系 Shiro整合Redis时,由于AOP的关系,在授权时,会出现授权执行的部分service代码不走Redis,而是直接进行数据库查询。 解决办法:在`UserRealm`中,将所有`@Autowired`注解的service层类进行懒加载处理,即直接加`@Lazy`注解。示例代码如下: ```java import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.authz.SimpleAuthorizationInfo; import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.subject.PrincipalCollection; import java.util.HashSet; import java.util.Set; public class UserRealm extends AuthorizingRealm { private static final Logger LOGGER = LoggerFactory.getLogger(UserRealm.class); @Autowired @Lazy private SysLoginService loginService; @Autowired @Lazy private IRoleService roleService; @Autowired @Lazy private IUserRoleService userRoleService; @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { User user = ShiroUtils.getSysUser(); Set<String> roles = new HashSet<>(); SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); roles.add(roleService.getDataByRoleId(userRoleService.getDataByUserId(user.getUserId()).getRoleId()).getRoleKey()); info.setRoles(roles); return info; } @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { // 省略其他代码 return null; } } ``` ### 原因二:Bean未被AOP代理 查询启动日志发现使用到的bean出现`is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto - proxying)`,而`@Cacheable`是需要走代理模式的。 解决办法:需要检查启动日志,确保使用到的bean能够被AOP代理。具体可以检查相关配置,保证Spring的AOP自动代理机制能够正常处理这些bean。 ### 原因三:Shiro整合导致注解失效 Spring Boot整合Shiro后,`UserRealm`类里自动注入的service中的注解失效。 解决办法:可以参考上述因AOP代理关系导致失效的解决办法,对`UserRealm`中注入的service类进行懒加载处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值