• Thymeleaf中使用Shiro


    根据用户权限显示不同页面:

    1.thymeleaf扩展shiro

    <dependencies>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- thymeleaf -->
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>

    <!-- shiro与spring整合 -->
    <dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-spring</artifactId>
    <version>1.4.2</version>
    </dependency>
    <!--mybatis-->
    <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.0.9</version>
    </dependency>
    <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.1.1</version>
    </dependency>

    <!-- thymeleaf整合shiro标签 -->
    <dependency>
    <groupId>com.github.theborakompanioni</groupId>
    <artifactId>thymeleaf-extras-shiro</artifactId>
    <version>2.0.0</version>
    </dependency>
    
    

    2.ShiroConfig和Realm

    @Configuration
    public class ShiroConfig {
    
    //    创建ShiroFilterFactoryBean
        @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager defaultWebSecurityManager){
    
        ShiroFilterFactoryBean shiroFilterFactoryBean=new ShiroFilterFactoryBean();
        shiroFilterFactoryBean.setSecurityManager(defaultWebSecurityManager);
    
    //    shiro内置过滤器
        /**  常用过滤器:
         *      anon:无需认证即可访问
         *      authc:要授权才可访问
         *      user:如果使用rememberMe的功能可以直接访问
         *      perms:该资源必须得到资源授权才可以访问
         *      roles:该资源必须得到角色授权才可以访问
         */
        Map<String,String> filterMap=new LinkedHashMap<>();
    //    filterMap.put("/add","authc");
    //    filterMap.put("/update","authc");
    
    //  所有路径都被拦截:filterMap.put("/**","authc");
    //一些路径不拦截(需要被放过去)
        filterMap.put("/th","anon");
        filterMap.put("/login","anon");
    
    //    授权过滤器
        filterMap.put("/add","perms[user:add]");
        filterMap.put("/update","perms[user:update]");
    
    //    配置自定义login.html
        shiroFilterFactoryBean.setLoginUrl("/login");
    //    配置未授权页面
        shiroFilterFactoryBean.setUnauthorizedUrl("/unAuth");
    
        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);
        return shiroFilterFactoryBean;
    }
    
    //      创建DefaultWebSecurityManager
        @Bean("securityManager")
    public DefaultWebSecurityManager getDefaultSecurityManager(@Qualifier("userRealm") UserRealm userRealm){
        DefaultWebSecurityManager securityManager=new DefaultWebSecurityManager();
        securityManager.setRealm(userRealm);
        return securityManager;
    }
    
    //    创建realm
        @Bean(name = "userRealm")
        public UserRealm getRealm(){
            return new UserRealm();
        }
    
    
    //    配置ShiroDialect:用于thymeleaf和shiro标签配合使用
        @Bean
        public ShiroDialect getShiroDialect(){
            return new ShiroDialect();
        }
    
    }
    public class UserRealm extends AuthorizingRealm {
        @Autowired
        private UserService userService;
    
        @Override
        protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
            System.out.println("授权");
    
    //        给资源进行授权
            SimpleAuthorizationInfo info=new SimpleAuthorizationInfo();
    //      添加资源的授权字符串
    //        info.addStringPermission("user:add");
    
    //        获取当前登陆用户
            Subject subject = SecurityUtils.getSubject();
            User user=(User) subject.getPrincipal();
    
            User user1=userService.findById(user.getId());
    
    //      添加资源的授权字符串
            String s= user1.getPerms();
            String[] split = s.split(",");
            for (int i = 0; i <split.length; i++) {
                info.addStringPermission(split[i]);
            }
            return info;
        }
    
        @Override
        protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
            System.out.println("身份认证");
    
            UsernamePasswordToken token=(UsernamePasswordToken)authenticationToken;
    
            User user = userService.findByName(token.getUsername());
    
            if (user==null){
                return null;
            }
            return new SimpleAuthenticationInfo(user,user.getPassword(),"");
        }
    }

    3.实体类:

    public class User {
        private Integer id;
        private String name;
        private String password;
        private String perms;
    。。。。。

    4.数据库:

     5.测试:用户1,1有添加和update两个权限,2,2只有一个

      <div shiro:hasPermission="user:add">
            <a th:href="${add}">添加</a>
        </div>
        <div shiro:hasPermission="user:update">
            <a th:href="${update}">update</a>
        </div>

     

     

     小demo地址:

    https://github.com/1017020555/shiro-springboot

  • 相关阅读:
    HTML5响应式导航
    草原图片大全
    草原psd素材
    仿堆糖图片自滚动瀑布流效果
    夏日户外风景PSD素材
    国画经典之梅花PSD素材
    更改VS的运行主窗体
    在VS中如何更换项目名称
    如何使用Visual Studio 2008(VS2008)编译C语言
    #region 私有字段
  • 原文地址:https://www.cnblogs.com/crazy-lc/p/12427569.html
Copyright © 2020-2023  润新知