springboot2.0整合shiro攻略

Shiro是什么

springboot2.0整合shiro攻略_第1张图片
Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码学和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。简单的讲,Shiro是一个Java平台的开源权限框架,用于认证和访问授权。

Shiro三个核心组件

Subject, SecurityManager 和 Realms

  • Subject:即“当前操作用户”。但是,在Shiro中,Subject这一概念并不仅仅指人,也可以是第三方进程、后台帐户(Daemon Account)或其他类似事物。它仅仅意味着“当前跟软件交互的东西”。但考虑到大多数目的和用途,你可以把它认为是Shiro的“用户”概念。Subject代表了当前用户的安全操作,SecurityManager则管理所有用户的安全操作。
  • SecurityManager:它是Shiro框架的核心,典型的Facade模式,Shiro通过SecurityManager来管理内部组件实例,并通过它来提供安全管理的各种服务。
  • Realm: Realm充当了Shiro与应用安全数据间的“桥梁”或者“连接器”。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息。

      从这个意义上讲,Realm实质上是一个安全相关的DAO:它封装了数据源的连接细节,并在需要时将相关数据提供给Shiro。当配置Shiro时,你必须至少指定一个Realm,用于认证和(或)授权。配置多个Realm是可以的,但是至少需要一个。
      
      Shiro内置了可以连接大量安全数据源(又名目录)的Realm,如LDAP、关系数据库(JDBC)、类似INI的文本配置资源以及属性文件等。如果缺省的Realm不能满足需求,你还可以插入代表自定义数据源的自己的Realm实现。
    Shrio

Shrio授权原型

授权三要素:用户,角色,权限(仅仅是操作权限,数据权限必须与业务需求紧密结合),资源(url)。

简单的讲:用户分配角色,角色定义权限。访问授权时支持角色或者权限,并且支持多级的权限定义。

Q:对组的支持?
A:shiro默认不支持对组设置权限。

Q:是否可以满足对组进行角色分配的需求?
A:扩展Realm,可以支持对组进行分配角色,其实就是给该组下的所有用户分配权限。

Q:对数据权限的支持? 在业务系统中定义?
A:shiro仅仅实现对操作权限的控制,用于在前端控制元素隐藏或者显示,以及对资源访问权限进行检查。数据权限与具体的业务需求紧密关联,shiro本身无法实现对数据权限的控制。

Q:动态权限分配?
A:扩展org.apache.shiro.realm.Realm,支持动态权限分配。

Q:与Spring集成?
A:shiro-spring项目可以与Spring无缝集成,shiro还支持jsp标签等。

shiro内置过滤器

简单的说只要理解这几个就够了
springboot2.0整合shiro攻略_第2张图片

下面是比较详细的解释
springboot2.0整合shiro攻略_第3张图片
- org.apache.shiro.web.filter.authc.AnonymousFilter
例如/admins/**=anon 没有参数,表示可以匿名使用。
- org.apache.shiro.web.filter.authc.FormAuthenticationFilter
例如/admins/user/**=authc表示需要认证才能使用,没有参数
- org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter
例如/admins/user/**=authcBasic没有参数表示httpBasic认证
- org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter
例如/admins/user/=perms[user:add:],perms参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,例如/admins/user/=perms[“user:add:,user:modify:*”],当有多个参数时必须每个参数都通过才通过,想当于
isPermitedAll()方法。
- org.apache.shiro.web.filter.authz.PortFilter
例如/admins/user/**=port[8081],当请求的url的端口不是8081是跳转到schemal://serverName:8081?queryString,其中schmal是协议http或https等,serverName是你访问的host,8081是url配置里port的端口,queryString
是你访问的url里的?后面的参数。
- org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter,
例如/admins/user/=rest[user],根据请求的方法,相当于/admins/user/=perms[user:method] ,其中method为post,get,delete等。
- org.apache.shiro.web.filter.authz.RolesAuthorizationFilter
例如/admins/user/=roles[admin],参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,当有多个参数时,例如/admins/user/=roles[“admin,guest”],每个参数通过才算通过,相当于hasAllRoles()方法。
- org.apache.shiro.web.filter.authz.SslFilter
例如/admins/user/**=ssl没有参数,表示安全的url请求,协议为https
user:例如/admins/user/**=user没有参数表示必须存在用户,当登入操作时不做检查
- org.apache.shiro.web.filter.authc.UserFilter
例如/admins/user/**=user没有参数表示必须存在用户,当登入操作时不做检查

可以理解为,过滤器分为两组,一组是认证过滤器anon,authcBasic,auchc,user,一组是授权过滤器perms,roles,ssl,rest,port。

可能遇到的坑

  • java.lang.NoClassDefFoundError: org/apache/shiro/mgt/SecurityManager
    用maven刷新项目,并且重新build clean compile。

  • Bean named ‘&shiroFilter’ is expected to be of type ‘org.springframework.beans.factory.config.BeanPostProcessor’ but was actually of type ‘org.springframework.beans.factory.support.NullBean’
    出现这种情况一般是ShiroFilterFactoryBean的方法返回了null导致。

springboot2-shiro实战部分

maven引入

        
        <dependency>
            <groupId>org.apache.shirogroupId>
            <artifactId>shiro-springartifactId>
            <version>1.4.0version>
        dependency>

springboot2的shiro配置

import java.util.LinkedHashMap;
import java.util.Map;

import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Shiro配置类
 * 1.配置ShiroFilterFactory 2.配置SecurityManager
 * @author zhengkai
 *
 */
@Configuration
public class ShiroConfig {
    /**
     * 配置shiro过滤器
     * @author zhengkai
     */
    @Bean("shiroFilter")                                                                                                                                                                                                               
    public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
        //1.定义shiroFactoryBean
        ShiroFilterFactoryBean shiroFilterFactoryBean=new ShiroFilterFactoryBean();
        //2.设置securityManager
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        //3.LinkedHashMap是有序的,进行顺序拦截器配置
        Map filterChainMap = new LinkedHashMap();
        //4.配置logout过滤器
        filterChainMap.put("/logout", "logout");
        //5.所有url必须通过认证才可以访问
        filterChainMap.put("/**","authc");
        //6.设置默认登录的url
        shiroFilterFactoryBean.setLoginUrl("/login");
        //7.设置成功之后要跳转的链接
        shiroFilterFactoryBean.setSuccessUrl("/index");
        //8.设置未授权界面
        shiroFilterFactoryBean.setUnauthorizedUrl("/403");
        //9.设置shiroFilterFactoryBean的FilterChainDefinitionMap
        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainMap);
        return shiroFilterFactoryBean;
    }
    /**
     * 配置安全管理器   
     * @author zhengkai
     */
    @Bean
    public SecurityManager securityManager() {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        return securityManager;
    }

}

springboot2.0整合shiro攻略_第4张图片
启动spring之后,发现shiroFilter的话。就证明成功了。

你可能感兴趣的:(Spring,SpringBoot2启示录)