Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码学和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。简单的讲,Shiro是一个Java平台的开源权限框架,用于认证和访问授权。
Subject, SecurityManager 和 Realms
Realm: Realm充当了Shiro与应用安全数据间的“桥梁”或者“连接器”。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息。
从这个意义上讲,Realm实质上是一个安全相关的DAO:它封装了数据源的连接细节,并在需要时将相关数据提供给Shiro。当配置Shiro时,你必须至少指定一个Realm,用于认证和(或)授权。配置多个Realm是可以的,但是至少需要一个。
Shiro内置了可以连接大量安全数据源(又名目录)的Realm,如LDAP、关系数据库(JDBC)、类似INI的文本配置资源以及属性文件等。如果缺省的Realm不能满足需求,你还可以插入代表自定义数据源的自己的Realm实现。
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标签等。
下面是比较详细的解释
- 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导致。
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;
}
}