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

 

【视频 & 交流平台】

à SpringBoot视频

http://study.163.com/course/introduction.htm?courseId=1004329008&utm_campaign=commission&utm_source=400000000155061&utm_medium=share

à SpringCloud视频

http://study.163.com/course/introduction.htm?courseId=1004638001&utm_campaign=commission&utm_source=400000000155061&utm_medium=share

à Spring Boot源码

https://gitee.com/happyangellxq520/spring-boot

à Spring Boot交流平台

http://412887952-qq-com.iteye.com/blog/2321532

 

 

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

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

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个小时进行编写,实在不易呀,打赏,点赞,评论,转发下。

 

-->关注微信公众号获取最新资讯:

 

【视频&交流平台】

à Spring Boot实战篇之Shiro

http://study.163.com/course/introduction.htm?courseId=1004523002

 

à Spring Boot交流平台

http://412887952-qq-com.iteye.com/blog/2321532

 

 ======================================

Spring Boot Shiro视频实战篇【已更新】

======================================

 

适合人群

有Spring Boot基础的人群。

 

使用技术

(1)spring boot(整合框架)

(2)spring mvc

(3)spring data jpa(持久化操作)

(4)shiro(安全框架)

(5)thymeleaf(模板引擎)

(6)ehcache(缓存管理)

(7)mysql(数据库)

(8)js/css/img(静态资源使用)

9kaptcha(验证码库)

课程目录

1. Spring Boot Shiro介绍

 

2. Spring Boot 搭建无Shiro的框架

 

3. Spring Boot Shiro拦截

 

4. Spring Boot Shiro身份认证准备工作

 

5. Spring Boot Shiro身份认证

 

6. Spring Boot Shiro权限控制

 

7. Spring Boot Shiro缓存

 

8. Spring Boot Shiro记住密码

 

9. Spring Boot Shiro登录成功之后下载favicon.ico

 

10. Spring Boot 在thymeleaf使用shiro标签

 

11. Spring Boot Shiro密码加密算法

 

12.Spring Boot Shiro使用JS-CSS-IMG

 

13. Spring Boot Shiro限制登录尝试次数

 

14.Spring Boot Shiro 验证码

猜你喜欢

转载自412887952-qq-com.iteye.com/blog/2359099