Shiro简单入门+个人理解
身为一个刚刚进入开发行业的学生,进入公司就开始了Shiro框架的应用,特此在这里写下收获。
Shiro是apache旗下一个开源安全框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证,权限授权、加密、会话管理等功能,组成了一个通用的安全认证框架,使用shiro就可以非常快速的完成认证、授权等功能的开发,降低系统成本。
在概念层,Shiro 架构包含三个主要的理念:Subject,SecurityManager和 Realm。

详细架构就不细说了,只从概要架构进行理解。

通过Shiro框架进行权限管理时,要涉及到的一些核心对象,主要包括:
认证管理对象,授权管理对象,会话管理对象,缓存管理对象,加密管理对象
以及Realm管理对象(领域对象:负责处理认证和授权领域的数据访问题)
1) Subject(主体):与软件交互的一个特定的实体(用户、第三方服务等)。
2) SecurityManager(安全管理器) :Shiro 的核心,用来协调管理组件工作。
3) Authenticator(认证管理器):负责执行认证操作
4) Authorizer(授权管理器):负责授权检测
5) SessionManager(会话管理):负责创建并管理用户 Session 生命周期,提供一个强有力的 Session 体验。
6) SessionDAO:代表 SessionManager 执行 Session 持久(CRUD)动作,它允许任何存储的数据挂接到 session 管理基础上。
7) CacheManager(缓存管理器):提供创建缓存实例和管理缓存生命周期的功能
8) Cryptography(加密管理器):提供了加密方式的设计及管理。
9)Realms(领域对象):是shiro和你的应用程序安全数据之间的桥梁。
以下废话不多说,直接进入应用环节
因为我是maven所有选择了添加了依赖
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.3.2</version>
</dependency>
创建spring-shiro.xml(tomcat启动时需要加载)
<?xml version="1.0" encoding="UTF-8"?>
<beans default-lazy-init="true"
xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-4.3.xsd
http://www.springframework.org/schema/data/jpa
http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd" >
<!-- 配置SecurityManager对象(Shiro框架核心,负责调用相关组件实现
用户身份认证,授权,缓存,会话管理等功能)-->
<bean id="securityManager"
class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="Realm" ref="ShiroUserRealm"/>
</bean>
<!-- 配置ShiroFilterFactoryBean对象(Shiro中会通过很多过滤器对WEB请求
做预处理,这些过滤器的创建底层设计了一个工厂类) -->
<bean id="shiroFilterFactory" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!-- 注入SecurityManager对象 -->
<property name="SecurityManager" ref="securityManager"/>
<!-- 配置登录页面 -->
<property name="LoginUrl" value="/login.jsp"/>
<!-- 定义过滤规则(哪些资源允许匿名访问,哪些资源必须授权访问)-->
<property name="FilterChainDefinitionMap">
<map>
<!-- 说明:anon表示允许匿名访问, authc表示授权访问-->
<entry key="/css/**" value="anon"/>
<entry key="/db_sql/**" value="anon"/>
<entry key="/images/**" value="anon"/>
<entry key="/js/**" value="anon"/>
<entry key="/META-INF/**" value="anon"/>
<entry key="/yzm/**" value="anon"/>
<!-- 这里是授权的应用,以xml方式来管理,当然也有使用注解或jsp标签的方式,在授权时我们会讲解-->
<!-- <entry key="/company/deleteCompany.do" value="perms[company:delete]" /> -->
<!-- <entry key="/page/xtgl/userList.jsp" value="perms[xtgl:userList]"> -->
<entry key="/login/getLogins.do" value="anon"/>
<entry key="/doLogout.do" value="logout"/>
<entry key="/**" value="authc"/>
</map>
</property>
</bean>
<!-- 配置bean对象的生命周期管理 -->
<bean id="lifecycleBeanPostProcessor"
class="org.apache.shiro.spring.LifecycleBeanPostProcessor">
</bean>
<!-- 配置Bean对象的代理 -->
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
depends-on="lifecycleBeanPostProcessor">
</bean>
<!-- 配置授权Bean对象 -->
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
<property name="SecurityManager" ref="securityManager"/>
<!--自定义realm对象-->
</bean>
<bean id="ShiroUserRealm" class="com.cn.ericsson.service.realm.ShiroUserRealm">
</bean>
</beans>
在web.xml进行的操作
<!-- 配置shiro过滤器(对请求进行拦截) -->
<filter>
<filter-name>shiroFilter</filter-name>
<!-- 此类型由谁提供(spring 框架):spring整合shiro的入口 -->
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<init-param>
<!-- 这个参数名在DelegatingFilterProxy中定义 -->
<param-name>targetBeanName</param-name>
<!-- 这个值在spring-shiro.xml配置文件中定义 -->
<param-value>shiroFilterFactory</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
自定义realm
@Service
public class ShiroUserRealm extends AuthorizingRealm {
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(
AuthenticationToken arg0) throws AuthenticationException {
// TODO Auto-generated method stub
return null;
}
}
到此环境已经搭建完成,后期说明认证及授权
对shiro框架的补充,看补充最多先看2,3
Shiro是什么?
Shiro是apache旗下一个开源安全框架,它将软件系统的安全认证相关的功能抽取出来
解决了什么问题
实现用户身份认证,权限授权、加密、会话管理等功能,组成了一个通用的安全认证框架,使用shiro就可以非常快速的完成认证、授权等功能的开发,降低系统成本。
Shiro的核心对象
1) Subject:与软件交互的一个特定的实体(用户、第三方服务等)。
2) SecurityManager :Shiro 的核心,用来协调管理组件工作。
3) Authenticator:负责执行认证操作(认证管理器)
4) Authorizer:负责授权检测(授权管理器)
5) SessionManager:负责创建并管理用户 Session 生命周期,提供一个强有力的 Session 体验。(回话管理器)
6) SessionDAO:代表 SessionManager 执行 Session 持久(CRUD)动作,它允许任何存储的数据挂接到 session 管理基础上。
7) CacheManager:提供创建缓存实例和管理缓存生命周期的功能(缓存管理器)
8) Cryptography:提供了加密方式的设计及管理。(加密器)
9) Realms:是shiro和你的应用程序安全数据之间的桥梁。
Shiro认证流程
- 当用户在登录的时候,获取登录用户的用户名和密码并将其封装在UsernamePasswordToken对象(令牌token)中
- 然后通过主身份Subject对象调用login(token)方法将令牌传递给SecurityManager安全管理器.
- 安全管理器则将认证操作委托给认证管理器Authenticator.
- 认证管理器Authenticator则底层则基于认证策略将登录用户的身份信息传递给相应的Realm.
- Realm则通过登录用户的身份信息从数据库获取用户数据,并将用户数据封装到SimpleAuthenticationInfo类中,返回给认证管理器.
- 认证管理器则通过比较登录用户的信息和从数据库查询出来的用户数据来判断当前用户是否存在,若存在则登录,若不存在,则拒绝登录.
- 由于在添加用户的时候,对用户的密码做了相应的MD5加密算法,所以在通过认证管理器比较用户信息是否合法时,需要告诉认证管理器用户的密码是通过MD5加密算法加密过得,若不告诉则密码将永远不会匹配.
Shiro的授权流程
当用户登录后执行某些操作时,需要判断当前用户是否有执行此操作的权限.在自定义的Realm类的授权方法中:
1) 通过PrincipalCollection对象获取当前用户的主身份
2) 通过这个主身份从数据库查询出当前用户拥有的角色id,通过角色id去数据库中查询出相对应的权限id,再通过权限id从数据库中获取相应的权限标识.
3) 由于在某些方法上添加过Shiro自带的@RequiredsPermissions注解,注解中写有权限标识,如@RequiredsPermissions(“------”).所以底层将通过反射获取到当前执行方法上的注解中的权限标识.
4) 当某方法上有@RequiredsPermissions(“-----”)注解时.就是在告诉系统执行此方法需要授权操作.底层会通过Subject对象调用isPermitted()方法判断该用户是否包含该注解中含有的权限标识,若有该标识则允许用户执行该操作,若没有该标识则表示用户没有执行该操作的权限.
5) 当获取到用户的权所有限标识之后,将权限标识(String类型的)封装到SimpleAuthorizationInfo对象中,返回给授权管理器Authrizor,底层判断用户是否具执行该操作的权限.
Shiro简单入门+个人理解的更多相关文章
- 权限框架 - shiro 简单入门实例
前面的帖子简单的介绍了基本的权限控制,可以说任何一个后台管理系统都是需要权限的 今天开始咱们来讲讲Shiro 首先引入基本的jar包 <!-- shiro --> <dependen ...
- shiro简单入门介绍
shiro是apache的一个java安全框架 可以完成认证,授权,加密,会话管理,基于web继承,缓存等 功能简介: 从外部来看: shiro架构 Subject:主体,代表了当前“用户”,这个用 ...
- C#委托的最简单入门和理解
委托是.net语言中非常重要的一个概念,初学不太好理解也没有关系的,在一次一次的攻关后会领会到委托的精妙,可以说 .net 没有委托就没有后面更高级的事件,异步多线程等等特性的形成可能.所以一定要 ...
- shiro的简单入门使用
这里只是测试登录认证,没有web模块,没有连接数据库,用户密码放在shiro.ini配置中,密码没有加密处理,简单入门. 基于maven 先看目录结构 测试结果 pom.xml <?xml ve ...
- Shiro简单配置
注:这里只介绍Spring配置模式. 因为官方例子虽然中有更加简洁的ini配置形式,但是使用ini配置无法与spring整合.而且两种配置方法一样,只是格式不一样. 涉及的jar包 核心包shiro- ...
- emacs最简单入门,只要10分钟
macs最简单入门,只要10分钟 windwiny @2013 无聊的时候又看到鼓吹emacs的文章,以前也有几次想尝试,结果都是玩不到10分钟就退出删除了. 这次硬着头皮,打开几篇文章都看完 ...
- [转] shiro简单配置
shiro(1) 注:这里只介绍spring配置模式. 因为官方例子虽然中有更加简洁的ini配置形式,但是使用ini配置无法与spring整合.而且两种配置方法一样,只是格式不一样. 涉及的jar包 ...
- delphi指针简单入门
delphi指针简单入门: 看一个指针用法的例子: 1 var 2 X, Y: Integer; // ...
- 运维自动化之SALTSTACK简单入门
运维自动化之SaltStack简单入门 饱食终日而无所事事,是颓也,废也.但看昨日,费九牛二虎之力除一BUG便流连于新番之中,不知东方之既黑,实乃颓颓然而荒废矣.故今日来缀一文以忏昨日之悔. Salt ...
- Asp.Net MVC学习总结(一)——Asp.Net MVC简单入门
一.MVC简单入门 1.1.MVC概念 视图(View) 代表用户交互界面,对于Web应用来说,可以概括为HTML界面,但有可能为XHTML.XML和Applet. 模型(Model) 表示用户对其数 ...
随机推荐
- 信创环境经典版SuerMap iManager启动崩溃
一.问题环境 操作系统:银河麒麟kylin V10 CPU:鲲鹏920 SuperMap iManager 10.2.1 硬件:16H64G机器 二.现象 磁盘和内存都有空闲,首次启动SuperMap ...
- PS安装插件提示无法加载扩展未正确签署 的解决办法
PS安装插件提示无法加载扩展未正确签署解决方式 win系统: 1.打开"运行"窗口(点击电脑左下角"开始"菜单,从打开的菜单中依次点击"所有程序&qu ...
- OOOPS:零样本实现360度开放全景分割,已开源 | ECCV'24
全景图像捕捉360°的视场(FoV),包含了对场景理解至关重要的全向空间信息.然而,获取足够的训练用密集标注全景图不仅成本高昂,而且在封闭词汇设置下训练模型时也受到应用限制.为了解决这个问题,论文定义 ...
- 墨天轮沙龙 | 腾讯云陈昊:TDSQL-C Serverless应用与技术实践
导读 数据库的发展由对性能的要求,逐步发展为对更为极致成本的要求,Serverless数据库是在高性能云数据库之上的极致成本优化方案.[墨天轮数据库沙龙-Serverless专场]邀请到腾讯云数据库产 ...
- FirewallD is not running 原因与解决方法
解决方法关于linux系统防火墙: centos5.centos6.redhat6系统自带的是iptables防火墙.centos7.redhat7自带firewall防火墙.ubuntu系统使用的是 ...
- KubeSphere 在直播应用中的实践
本文是上海站 Meetup 讲师唐明根据其分享内容整理的文章. 引言 目前媒体的主流传播渠道已从传统的报纸.广播.电视转向了互联网,各种视频及社交 App 成为了人们获取资讯的首选途径.苏州市广播电视 ...
- 欢迎体验程序员Lingma的助攻手
如果你是一位软件开发者,(同义灵码)Lingma可以帮助你做基础架构的脚手架相关工作事宜以及部分代码开发,对比之前没有灵码,现在提效了她可以给予你零编码的快感,准确快速地读懂了你我的需求,例如答问场景 ...
- CSS动画(毛玻璃按钮)
1.整体效果 https://mmbiz.qpic.cn/sz_mmbiz_gif/EGZdlrTDJa4ofJ9W4ibgD5asQcBesp1f1CXVnrQmicnzqDPskBNEQC4ia0 ...
- Python 潮流周刊#74:创下吉尼斯世界记录的 Python 编程课(摘要)
本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...
- mysql弱密码爆破
mySQL弱密码 靶场:/vulhub/mysql/CVE-2012-2122 启动: docker-compose up -d 扫描端口 nmap -Sv -Pn -T4 靶机ip 看到在33 ...