精华内容
下载资源
问答
  • shiro细粒度权限控制以及开发中碰到的bug

    spring AOP 默认动态代理方式为jdk

    在进行shiro细粒度权限控制(即控制方法)时,要将动态代理方式改为cglib的

    因为

    cglib产生的动态代理对象与原对象是继承关系,这样写在原对象上的注解在动态代理对象上才会有效

    而默认的Jdk动态代理产生的代理对象与原对象实现同一个接口,类似于兄弟关系,所以注解会失效


    开发中碰到的bug

    实际开发中细粒度权限控制的注解是加在action的方法上的,但是因为此项目中自定义的BaseAction类中获得的是父类的泛型,而采用cglib动态代理产生的代理对象,相当于孙子类,这样获取到的泛型就错了,可以加个判断,或者将注解写在service


    展开全文
  • 细粒度(方法)权限控制原因: 自定义注解(加在方法上,在注解中描述需要权限信息),对目标业务对象创建代理对象,在代理方法中使用反射技术读取注解信息,获取需要权限,查询当前登录用户具有权限是否满足 ...

    细粒度(方法)权限控制原因: 自定义注解(加在方法上,在注解中描述需要权限信息),对目标业务对象创建代理对象,在代理方法中使用反射技术读取注解信息,获取需要权限,查询当前登录用户具有权限是否满足  

     

    1、 配置 applicationContext-shiro.xml  激活注解  

    传统 spring AOP 配置 , 对 spring bean 创建代理 Advisor ,会在业务 Bean 使用 shiro 注解, 配置自动代理模式 (对所有 spring 管理 bean 的方法,执行时,检查是否有 shiro 注解 )

     

    2、 配置快递员添加 方法,业务层使用 shiro 注解  

     

    注意问题:

    针对 CourierServiceImpl 对象进行代理 !!!  解决:  

    applicationContext-dataSource.xml  

    applicationContext-shiro.xml  

     

    使用方法注解进行权限控制, 当权限不足时,代理对象抛出一个异常  

    org.apache.shiro.authz.UnauthorizedException: Subject does not have permission [courier_add]

    展开全文
  • shiro 注解方式的权限控制基于代理实现,  如果写了用了多个注解会按照内定的顺序一个一个验证, 而不是按使用的先后顺序.  RequiresRoles RequiresPermissions RequiresAuthentication RequiresUser ...

    shiro 注解方式的权限控制基于代理实现,

      如果写了用了多个注解会按照内定的顺序一个一个验证, 而不是按使用的先后顺序.

      RequiresRoles
      RequiresPermissions
      RequiresAuthentication
      RequiresUser
      RequiresGuest

     

     

      @Bean
      @DependsOn({"lifecycleBeanPostProcessor"})
      public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator() {
       DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
       advisorAutoProxyCreator.setProxyTargetClass(true);
       return advisorAutoProxyCreator;
      }

            //权限控制map
    Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();

         //filterChainDefinitionMap.put("/user/**", "roles[user]");
    filterChainDefinitionMap.put("/user/**", "perms[user]");
    filterChainDefinitionMap.put("/account/**", "perms[account]");

        
            SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
    Set<String> set = new HashSet<String>();
         //set.add("users");
         //info.setRoles(set);
    set.add("user");
    info.setStringPermissions(set);

    return info;


     

    url基于过滤器实现:

      //自定义过滤器
      Map<String, Filter> filterMap = new LinkedHashMap<>();
      shiroFilterFactoryBean.setFilters(filterMap);

      filterChainDefinitionMap.put("/user/**", "authc");
      filterChainDefinitionMap.put("/**", "authc");
      filterChainDefinitionMap.put("/user/**", "requestURL"); //必须在/**,authc之前添加被控制的路径

        @Autowired
    IPermissionService permissionService;

    public static URLPathMatchingFilter testUtils;

       // @Autowired 注入失败 使用此方式 @PostConstruct
    @PostConstruct
    public void init() {
    testUtils = this;
    }

      
      //保存当前地址并重定向到登录界面  参考张开涛大神的<跟我学shiro>
      HttpServletRequest req = (HttpServletRequest) request;
      HttpServletResponse resp = (HttpServletResponse) response;
      saveRequestAndRedirectToLogin(req, resp);
      return false;


     

     项目源码地址 (问题多多,请不吝赐教)

     








    转载于:https://www.cnblogs.com/rempop/p/10880520.html

    展开全文
  • 1.在applicationContext.xml中配置,激活shiro的注解。 <!-- 配置shiro注解 --> <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on=...

    1.在applicationContext.xml中配置,激活shiro的注解。

       <!-- 配置shiro注解 -->
    	<bean
    		class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
    		depends-on="lifecycleBeanPostProcessor">
            //将默认的JDK代理模式转换成CJLB代理模式
    		<property name="proxyTargetClass" value="true"></property>
    	</bean>
     
    	<bean
    		class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
    		<property name="securityManager" ref="securityManager" />
    	</bean>
    

    需要注意的是因为shiro的注解是写在方法上面的,而shiro的注解是默认的情况下是通过代理对象是对接口的代理,而接口中的方法是没有注解的,所以我们需要把默认的jdk(接口代理)代理换成CJLB(继承代理),同时我们配置的事务注解也会受到影响,因此我们需要将事务的注解配置也换成CJLB的代理模式。

    <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>
    

    2.在service层中的方法上添加shiro的注解。

    @Service
    @Transactional
    public class CourierServiceImpl implements CourierService {
     
    	// 注入DAO 对象
    	@Autowired
    	private CourierRepository courierRepository;
     
    	@Override
    	@RequiresRoles("base")
    	public void save(Courier courier) {
    		courierRepository.save(courier);
    	}
    }
    

    shiro的5个常用注解如下:

    • RequiresAuthentication

    使用该注解标注的类,实例,方法在访问或调用时,当前Subject必须在当前session中已经过认证。

    • RequiresGuest

    使用该注解标注的类,实例,方法在访问或调用时,当前Subject可以是“gust”身份,不需要经过认证或者在原先的session中存在记录。

    • RequiresPermissions

    当前Subject需要拥有某些特定的权限时,才能执行被该注解标注的方法。如果当前Subject不具有这样的权限,则方法不会被执行。

    • RequiresRoles

    当前Subject必须拥有所有指定的角色时,才能访问被该注解标注的方法。如果当天Subject不同时拥有所有指定角色,则方法不会执行还会抛出AuthorizationException异常。

    • RequiresUser

    当前Subject必须是应用的用户,才能访问或调用被该注解标注的类,实例,方法。
    3.在自定义的realm类中重写doGetAuthorizationInfo()方法,将登陆用户的授权和角色信息存入到SecurityManager中,这样SecutityManager就会将用户的权限或角色与注解所需要的进行对比,当权限不足的时候就会抛出org.apache.shiro.authz.UnauthorizedException。

        @Override
    	// 授权
    	protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) {
    		SimpleAuthorizationInfo simInfo = new SimpleAuthorizationInfo();
    		//根据当前登录的用户查询角色和权限信息
    		Subject subject = SecurityUtils.getSubject();
    		User user = (User) subject.getPrincipal();
    		//调用业务层,查询角色信息
    		List<Role> roles = rolesService.findByUser(user);
    		//为授权对象加入角色
    		for (Role role : roles) {
    			simInfo.addRole(role.getKeyword());
    		}
    		
    		//调用业务层,查询用户权限
    		List<Permission> permissions=perissionService.findByUser(user);
    		for (Permission permission : permissions) {
    			simInfo.addStringPermission(permission.getKeyword());
    		}
    		return simInfo;
    	}
    
    展开全文
  • 前面一章springboot2+shiro+jwt整合(一)登录认证我们说了如何进行登录认证,下面我们来看如何进行细粒度权限控制。 简单来说,当项目启动起来后,我们的后台接口的权限控制就应该起作用了,那么如何使用shiro来...
  • 所谓的细粒度控制,就是根据用户登录权限的不同,显示不同的菜单,例如,用户如果有添加用户,修改用户的权限,我们就显示这个俩个菜单,然后我们并不显示删除用户的菜单。如何自定义jsp标签1.定义一个权限标签,...
  • 牛逼plus,Spring Boot-Shiro-Vue权限系统(细粒度控制到按钮)
  • 项目源码:https://github.com/weimingge14/Shiro-project ...关于 Shiro权限匹配器和过滤器 上一节,我们实现了自定义的 Realm,方式是继承 AuthorizingRealm 这个抽象类,分别实现认证的方法...
  • 最近在使用jwt作为token使用,然后整合shiro,并实现URL权限细粒度控制。本项目只是一个demo。可能有些考虑的不太全 对于shiro控制权限的一些注解我个人觉得有些麻烦,需要在每个接口加上注解,不太灵活,而且我要...
  • 1.1 什么是粗粒度和细粒度权限粗粒度权限管理,对资源类型的权限管理。资源类型比如:菜单、url连接、用户添加页面、用户信息、类方法、页面中按钮。。 粗粒度权限管理比如:超级管理员可以访问户添加页面、用户...
  • RBAC权限五表 经典的权限五表:用户表+...shiro就是通过上面的方式来查询权限的:当用户登录之后先确定角色信息,在通过角色查询权限 shiro的使用 shiro maven <!--shiro和spring整合--> <dependency>
  • 本来想介绍shiro如何对接口进行权限控制,后来想想如何和市面上讲的那些理论一样,那样的话多么索然无味,所以接下来将给读者介绍一种 "土" 方法,即很原生态的一种权限控制。 当用户登录时,后台将该用户拥有的...
  • Shiro的官方文档中,默认介绍的是与JSP整合来做页面上的权限控制Shiro有一套自己的标签库,能与JSP无缝整合,只需要在JSP页面上引入Shiro的标签库即可 <%@ taglib prefix="shiro" uri=...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 185
精华内容 74
关键字:

shiro细粒度权限控制