作者:英俊大郎AAAA | 来源:互联网 | 2023-06-03 11:50
springboot之安全框架Shiro10shiro简介ApacheShiro是一个java的安全(权限)框架shiro可以非常容易的开发出足够好的应用,器不仅可以在javaSE
spring boot之安全框架Shiro10
shiro简介
Apache Shiro 是一个java的安全(权限)框架
shiro 可以非常容易的开发出足够好的应用,器不仅可以在javaSE环境,也可以在JavaEE环境.
shiro可以完成认证,授权,加密,会话管理,Web集成,缓存等
下载地址:http://shiro.apache.org/
shiro架构
三大核心对象
subject: 应用代码直接交互的对象是subject,也就是是说shiro的对外API核心就是subject,subject代表了当前的用户,这个用户不一定是一个具体的人,与当前应用交互的任何东西都是subject,如网络爬虫,机器人等.于subject的所有交互都会委托给SecurtityManager;subject其实是一个门面,SecurityManageer才是实际的执行者
SecurityManageer: 安全管理器,即所有与安全有关的操作都会与SecurityManageer交互,并且它管理着所有的subject,可以看出它是shiro的核心,它负责与shiro的其他组件进行交互,它相当于spring MVC的DispatcherServlet的角色
Realm:shiro从Realm获取安全数据(如用户,角色,权限),就是说SecurityManageer要验证用户身份,那它需要从Realm获取相应的用户进行比较,来确定用户的身份是否合法;也需要Realm的到用户相应的角色,权限,进行验证用户的操作是否能够进行,可以把Realm看成DataSource;
首先编写一个用户的数据的类去继承AuthorizingRealm需要重写了俩个方法,分别是认证和授权
通过登录获取账号密码由subject对象来进行校验:
编写一个配置类将我们的方法返回的对象让spring来管理
package com.example.config;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.LinkedHashMap;
import java.util.Map;
//@Configuration
public class ShiroConfig {@Beanpublic ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager defaultWebSecurityManager){ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();//设置安全管理器bean.setSecurityManager(defaultWebSecurityManager);//添加shiro的内置过滤器Map map = new LinkedHashMap<>();map.put("/index","anno");map.put("/list","authc");bean.setFilterChainDefinitionMap(map);bean.setLoginUrl("/index");return bean;}
@Bean(name = "securityManager")public DefaultWebSecurityManager getDefaultWebSecurityManager( @Qualifier("userRealm") UserRealm userRealm){DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();//关联UserRealmsecurityManager.setRealm(userRealm);return securityManager;}//创建了realm对象@Beanpublic UserRealm userRealm(){return new UserRealm();}
}
最后通过访问页面可以来进行权限访问,没有权限则返回登录页面
总结spring security和shiro的异同
spring security和shiro的异同
相同点
1、认证功能2、授权功能3、加密功能4、会话管理5、缓存支持
6、rememberMe功能
不同点
1、Spring Security 基于Spring 开发,项目若使用 Spring 作为基础,配合 Spring Security 做权限更加方便,而 Shiro 需要和 Spring 进行整合开发;
2、Spring Security 功能比 Shiro 更加丰富些,例如安全维护方面;
3、Spring Security 社区资源相对比 Shiro 更加丰富;
Spring Security对Oauth、OpenID也有支持,Shiro则需要自己手动实现。而且Spring Security的权限细粒度更高
spring security 接口 RequestMatcher 用于匹配路径,对路径做特殊的请求,类似于shiro的
抽象类 PathMatchingFilter,但是 RequestMatcher 作用粒度更细
4、Shiro 的配置和使用比较简单,Spring Security 上手复杂些;
5、Shiro 依赖性低,不需要任何框架和容器,可以独立运行.Spring Security 依赖Spring容器;
6、shiro 不仅仅可以使用在web中,还支持非web项目它可以工作在任何应用环境中。在集群会话时Shiro最重要的一个好处或许就是它的会话是独立于容器的。
apache shiro的话,简单,易用,功能也强大,spring官网就是用的shiro,可见shiro的强大。
spring security 和 shiro 对加密都提供了各种各样的支持 例如 BCryptPasswordEncoder 采用 SHA-256 + 随机盐 + 秘钥 对密码进行加密。shrio 的 SimpleHash 提供散列算法的支持,生成数据的摘要信息.
shiro 的 AuthorizingRealm 的 doGetAuthorizationInfo方法 与 doGetAuthenticationInfo 一个 是定义 获取 用户权限信息 的方法,一 个 是 定义用户身份认证及获取用户身份的方法,
而 spring security 也有 资源 角色 授权器 FilterInvocationSecurityMetadataSource,定义资源url 与 角色权限的关系 , 决策 管理器 AccessDecisionManager 定义权限满足的规则