SpringBoot集成Shiro使用

在SpringBoot中集成Shiro

  1. 相关依赖:

     <dependency>
         <groupId>org.apache.shiro</groupId>
         <artifactId>shiro-spring-boot-starter</artifactId>
         <version>1.8.0</version>
     </dependency>
     <dependency>
         <groupId>org.apache.shiro</groupId>
         <artifactId>shiro-cache</artifactId>
         <version>1.8.0</version>
     </dependency>
     <dependency>
         <groupId>com.github.theborakompanioni</groupId>
         <artifactId>thymeleaf-extras-shiro</artifactId>
         <version>2.0.0</version>
     </dependency>
    
  2. shiro配置代码

@Configuration
public class ShiroConfig {
    /**
     * shiro拦截器
     *
     * @param securityManager
     * @return
     */
    @Bean("shiroFilterFactoryBean")
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(DefaultWebSecurityManager securityManager) {

        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();

        // 给 filter 设置 安全管理器
        shiroFilterFactoryBean.setSecurityManager(securityManager);

        // 设置拦截路径
        HashMap<String, String> filterMap = new LinkedHashMap<>();

        filterMap.put("/admin/login/captcha", "anon");//anon:标识此请求为公共资源,所有人可以访问

        filterMap.put("/admin/login/check", "anon");//anon:标识此请求为公共资源,所有人可以访问

        filterMap.put("/admin/login/index.html", "anon");//anon:标识此请求为公共资源,所有人可以访问

        filterMap.put("/admin/**", "authc");//authc:标识请求此资源需要认证和授权

        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);

        // 设置拦截跳转至验证的路径
        shiroFilterFactoryBean.setLoginUrl("/admin/login/index.html");

        return shiroFilterFactoryBean;
    }


    @Bean("defaultWebSecurityManager")
    public DefaultWebSecurityManager getDefaultWebSecurityManager(Realm realm, DefaultWebSessionManager defaultWebSessionManager) {

        DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();

        defaultWebSecurityManager.setSessionManager(defaultWebSessionManager);

        defaultWebSecurityManager.setRealm(realm);

        return defaultWebSecurityManager;
    }


    @Bean("defaultWebSessionManager")
    public DefaultWebSessionManager defaultSessionManager() {

        DefaultWebSessionManager defaultWebSessionManager = new DefaultWebSessionManager();

        // 设置session过期时间3600s
        Long timeout = 60L * 1000 * 60;//毫秒级别

        defaultWebSessionManager.setGlobalSessionTimeout(timeout);

        //解决登录时地址栏出现toLogin;jsessionid 问题
        defaultWebSessionManager.setSessionIdUrlRewritingEnabled(false);

        return defaultWebSessionManager;
    }


    /**
     * 设置凭证匹配器为hash
     *
     * @return
     */
    @Bean
    public Realm getRealm() {
        UserRealm userRealm = new UserRealm();

        HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();
        //设置密码为MD5加密
        hashedCredentialsMatcher.setHashAlgorithmName("md5");
        //散列次数为1024次
        hashedCredentialsMatcher.setHashIterations(1024);
        //设置凭证匹配器为hashedCredentialsMatcher
        userRealm.setCredentialsMatcher(hashedCredentialsMatcher);
        //开启缓存管理,不用每次查询数据库
        userRealm.setCacheManager(new MemoryConstrainedCacheManager());
        //开启全局缓存
        userRealm.setCachingEnabled(true);
        //开启认证缓存
        userRealm.setAuthenticationCachingEnabled(true);
        //开启授权缓存
        userRealm.setAuthenticationCachingEnabled(true);

        return userRealm;
    }


    /**
     * 启用shiro方言,可以在页面上使用shiro的标签
     *
     * @return
     */
    @Bean
    public ShiroDialect shiroDialect() {
        return new ShiroDialect();
    }


    /**
     * 启用shiro注解 加入注解的使用,不加入这个注解不生效
     */
    @Bean
    public AuthorizationAttributeSourceAdvisor getAuthorizationAttributeSourceAdvisor(
            org.apache.shiro.mgt.SecurityManager securityManager) {
        AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
        advisor.setSecurityManager(securityManager);
        return advisor;
    }

}
  1. 自定义Realm代码
posted @ 2022-09-24 16:34  加瓦同学  阅读(130)  评论(0编辑  收藏  举报