`

106.4 Spring Boot之Shiro无状态(4)【从零开始学Spring Boot】

阅读更多

 

 

【原创文章,转载请注明出处】

上一节写到了请求控制拦截,这节我们讲讲怎么加入权限控制。

1)如何权限控制呢?

       权限控制就比较简单了,主要需要操作两步:

其一就是,在shiroConfiguration中加入【开启shiro aop注解支持】和【自动代理所有的advisor】,具体代码如下:

package com.kfit.config;

 

import java.util.LinkedHashMap;

import java.util.Map;

 

import org.apache.shiro.mgt.DefaultSessionStorageEvaluator;

import org.apache.shiro.mgt.DefaultSubjectDAO;

import org.apache.shiro.mgt.SecurityManager;

import org.apache.shiro.session.mgt.DefaultSessionManager;

import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;

import org.apache.shiro.spring.web.ShiroFilterFactoryBean;

import org.apache.shiro.web.mgt.DefaultWebSecurityManager;

import org.apache.shiro.web.mgt.DefaultWebSubjectFactory;

import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

 

/**

 * shiro配置类.

 * @author Angel --守护天使

 * @version v.0.1

 * @date 2017225

 */

@Configuration

public class ShiroConfiguration {

   

    @Bean

    public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager){

       ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();

       factoryBean.setSecurityManager(securityManager);

      

       //Add.4.2.start

       factoryBean.getFilters().put("statelessAuthc", statelessAuthcFilter());

       //拦截器.

        Map<String,String> filterChainDefinitionMap = new LinkedHashMap<String,String>();

        filterChainDefinitionMap.put("/**", "statelessAuthc");

       factoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);

       //Add.4.2.end

      

       return factoryBean;

    }

   

    /**

     * shiro安全管理器:

     * 主要是身份认证的管理,缓存管理,cookie管理,

     * 所以在实际开发中我们主要是和SecurityManager进行打交道的

     * @return

     */

    @Bean

    public DefaultWebSecurityManager securityManager() {

        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();

       

        //Add.2.2

        securityManager.setSubjectFactory(subjectFactory());

        //Add.2.5

        securityManager.setSessionManager(sessionManager());

        //Add.4.4

        securityManager.setRealm(statelessRealm());

        /*

         * 禁用使用Sessions 作为存储策略的实现,但它没有完全地禁用Sessions

         * 所以需要配合context.setSessionCreationEnabled(false);

         */

        //Add.2.3

        ((DefaultSessionStorageEvaluator)((DefaultSubjectDAO)securityManager.getSubjectDAO()).getSessionStorageEvaluator()).setSessionStorageEnabled(false);

       

       

        return securityManager;

    }

   

    /**

     * Add.2.1

     * subject工厂管理器.

     * @return

     */

    @Bean

    public DefaultWebSubjectFactory subjectFactory(){

       StatelessDefaultSubjectFactory subjectFactory = new StatelessDefaultSubjectFactory();

       return subjectFactory;

    }

   

    /**

     * Add.2.4

     * session管理器:

     * sessionManager通过sessionValidationSchedulerEnabled禁用掉会话调度器,

     * 因为我们禁用掉了会话,所以没必要再定期过期会话了。

     * @return

     */

    @Bean

    public DefaultSessionManager sessionManager(){

       DefaultSessionManager sessionManager = new DefaultSessionManager();

       sessionManager.setSessionValidationSchedulerEnabled(false);

       return sessionManager;

    }

   

   

    /**

     * Add.4.3

     * 自己定义的realm.

     * @return

     */

    @Bean

    public  StatelessAuthorizingRealm statelessRealm(){

       StatelessAuthorizingRealm realm = new StatelessAuthorizingRealm();

       return realm;

    }

   

   

    /**

     * Add.4.1

     * 访问控制器.

     * @return

     */

    @Bean

    public StatelessAccessControlFilter statelessAuthcFilter(){

       StatelessAccessControlFilter statelessAuthcFilter = new StatelessAccessControlFilter();

       return statelessAuthcFilter;

    }

   

    /**

     *  Add.5.1

     *  开启shiro aop注解支持.

     *  使用代理方式;所以需要开启代码支持;

     * @param securityManager

     * @return

     */

    @Bean

    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager){

       AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();

       authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);

       return authorizationAttributeSourceAdvisor;

    }

   

    /**

     * Add.5.2

     *   自动代理所有的advisor:

     *   Advisor决定对哪些类的方法进行AOP代理。

     */

    @Bean

    public DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator() {

       DefaultAdvisorAutoProxyCreator daap = new DefaultAdvisorAutoProxyCreator();

       daap.setProxyTargetClass(true);

       returndaap;

   }

   

}

       第二步在helloController添加一个新的测试方法,在方法中加入注解:@RequiresRoles("admin")即可,部分代码如下:

   @RequestMapping("/hello4")

   @RequiresRoles("admin")

// @RequiresPermissions("userInfo:add")//权限管理;

   public String hello4(){

      return "hello4,Andy";

   }

       到这里就可以进行测试下,正确的测试地址:

http://127.0.0.1:8080/hello4?username=admin&params1=love&params2=girl&digest=df7f1595bd5682638556072c8ccde5edadcd807a829373d21af38fb1bc707da7

       错误的测试地址:http://127.0.0.1:8080/hello4?username=zs&params1=love&params2=girl&digest=df7f1595bd5682638556072c8ccde5edadcd807a829373d21af38fb1bc707da7

       会报错:.UnauthorizedException: Subject does not have role [admin]

 

       好了,shiro无状态编程就到此为此了,花了博主2个小时进行编写,实在不易呀,打赏,点赞,评论,转发下。

 

 à悟空学院:https://t.cn/Rg3fKJD

学院中有Spring Boot相关的课程!点击「阅读原文」进行查看!

SpringBoot视频:http://t.cn/A6ZagYTi

Spring Cloud视频:http://t.cn/A6ZagxSR

SpringBoot Shiro视频:http://t.cn/A6Zag7IV

SpringBoot交流平台:https://t.cn/R3QDhU0

SpringData和JPA视频:http://t.cn/A6Zad1OH

SpringSecurity5.0视频:http://t.cn/A6ZadMBe

Sharding-JDBC分库分表实战http://t.cn/A6ZarrqS

分布式事务解决方案「手写代码」:http://t.cn/A6ZaBnIr

分享到:
评论
5 楼 jsx112 2017-09-13  
博主,报错的连接休整下摘要:
http://127.0.0.1:8080/hello4?username=zs&params1=love&params2=girl&digest=910db60038a1929003d6d719c487310188a8550b928f541cd78043e783017ca1
4 楼 淡淡的伤你 2017-04-06  
    
3 楼 飞天0407 2017-03-02  
林祥纤 写道
飞天0407 写道
博主,项目运行报错如下:
org.apache.shiro.UnavailableSecurityManagerException: No SecurityManager accessible to the calling code, either bound to the org.apache.shiro.util.ThreadContext or as a vm static singleton.  This is an invalid application configuration.

不知道您是否遇到


No SecurityManager accessible to the calling code:

是不是少了SecurityManager ,另外你加@Bean了嘛,还有可能报错就是加入热部署了,先去掉试试。

@Bean
    public SecurityManager securityManager() {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();

        securityManager.setSubjectFactory(subjectFactory());

        securityManager.setSessionManager(sessionManager());

        securityManager.setRealm(statelessRealm());

        ((DefaultSessionStorageEvaluator)((DefaultSubjectDAO)securityManager.getSubjectDAO()).getSessionStorageEvaluator()).setSessionStorageEnabled(false);

        return securityManager;
    }

securityManager已经加入的,并且把热部署已经去除,还是报错。检查了代码,都一样啊,博主确定已经测试通过了是吧?
2 楼 林祥纤 2017-03-01  
飞天0407 写道
博主,项目运行报错如下:
org.apache.shiro.UnavailableSecurityManagerException: No SecurityManager accessible to the calling code, either bound to the org.apache.shiro.util.ThreadContext or as a vm static singleton.  This is an invalid application configuration.

不知道您是否遇到


No SecurityManager accessible to the calling code:

是不是少了SecurityManager ,另外你加@Bean了嘛,还有可能报错就是加入热部署了,先去掉试试。
1 楼 飞天0407 2017-03-01  
博主,项目运行报错如下:
org.apache.shiro.UnavailableSecurityManagerException: No SecurityManager accessible to the calling code, either bound to the org.apache.shiro.util.ThreadContext or as a vm static singleton.  This is an invalid application configuration.

不知道您是否遇到

相关推荐

Global site tag (gtag.js) - Google Analytics