身为一个刚刚进入开发行业的学生,进入公司就开始了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认证流程

  1. 当用户在登录的时候,获取登录用户的用户名和密码并将其封装在UsernamePasswordToken对象(令牌token)中
  2. 然后通过主身份Subject对象调用login(token)方法将令牌传递给SecurityManager安全管理器.
  3. 安全管理器则将认证操作委托给认证管理器Authenticator.
  4. 认证管理器Authenticator则底层则基于认证策略将登录用户的身份信息传递给相应的Realm.
  5. Realm则通过登录用户的身份信息从数据库获取用户数据,并将用户数据封装到SimpleAuthenticationInfo类中,返回给认证管理器.
  6. 认证管理器则通过比较登录用户的信息和从数据库查询出来的用户数据来判断当前用户是否存在,若存在则登录,若不存在,则拒绝登录.
  7. 由于在添加用户的时候,对用户的密码做了相应的MD5加密算法,所以在通过认证管理器比较用户信息是否合法时,需要告诉认证管理器用户的密码是通过MD5加密算法加密过得,若不告诉则密码将永远不会匹配.

Shiro的授权流程

当用户登录后执行某些操作时,需要判断当前用户是否有执行此操作的权限.在自定义的Realm类的授权方法中:

1)  通过PrincipalCollection对象获取当前用户的主身份

2)  通过这个主身份从数据库查询出当前用户拥有的角色id,通过角色id去数据库中查询出相对应的权限id,再通过权限id从数据库中获取相应的权限标识.

3)  由于在某些方法上添加过Shiro自带的@RequiredsPermissions注解,注解中写有权限标识,如@RequiredsPermissions(“------”).所以底层将通过反射获取到当前执行方法上的注解中的权限标识.

4)  当某方法上有@RequiredsPermissions(“-----”)注解时.就是在告诉系统执行此方法需要授权操作.底层会通过Subject对象调用isPermitted()方法判断该用户是否包含该注解中含有的权限标识,若有该标识则允许用户执行该操作,若没有该标识则表示用户没有执行该操作的权限.

5)  当获取到用户的权所有限标识之后,将权限标识(String类型的)封装到SimpleAuthorizationInfo对象中,返回给授权管理器Authrizor,底层判断用户是否具执行该操作的权限.

 

Shiro简单入门+个人理解的更多相关文章

  1. 权限框架 - shiro 简单入门实例

    前面的帖子简单的介绍了基本的权限控制,可以说任何一个后台管理系统都是需要权限的 今天开始咱们来讲讲Shiro 首先引入基本的jar包 <!-- shiro --> <dependen ...

  2. shiro简单入门介绍

    shiro是apache的一个java安全框架 可以完成认证,授权,加密,会话管理,基于web继承,缓存等 功能简介: 从外部来看: shiro架构  Subject:主体,代表了当前“用户”,这个用 ...

  3. C#委托的最简单入门和理解

      委托是.net语言中非常重要的一个概念,初学不太好理解也没有关系的,在一次一次的攻关后会领会到委托的精妙,可以说 .net 没有委托就没有后面更高级的事件,异步多线程等等特性的形成可能.所以一定要 ...

  4. shiro的简单入门使用

    这里只是测试登录认证,没有web模块,没有连接数据库,用户密码放在shiro.ini配置中,密码没有加密处理,简单入门. 基于maven 先看目录结构 测试结果 pom.xml <?xml ve ...

  5. Shiro简单配置

    注:这里只介绍Spring配置模式. 因为官方例子虽然中有更加简洁的ini配置形式,但是使用ini配置无法与spring整合.而且两种配置方法一样,只是格式不一样. 涉及的jar包 核心包shiro- ...

  6. emacs最简单入门,只要10分钟

    macs最简单入门,只要10分钟  windwiny @2013    无聊的时候又看到鼓吹emacs的文章,以前也有几次想尝试,结果都是玩不到10分钟就退出删除了. 这次硬着头皮,打开几篇文章都看完 ...

  7. [转] shiro简单配置

    shiro(1) 注:这里只介绍spring配置模式. 因为官方例子虽然中有更加简洁的ini配置形式,但是使用ini配置无法与spring整合.而且两种配置方法一样,只是格式不一样. 涉及的jar包 ...

  8. delphi指针简单入门

    delphi指针简单入门:         看一个指针用法的例子:     1         var     2             X,   Y:   Integer;       //   ...

  9. 运维自动化之SALTSTACK简单入门

    运维自动化之SaltStack简单入门 饱食终日而无所事事,是颓也,废也.但看昨日,费九牛二虎之力除一BUG便流连于新番之中,不知东方之既黑,实乃颓颓然而荒废矣.故今日来缀一文以忏昨日之悔. Salt ...

  10. Asp.Net MVC学习总结(一)——Asp.Net MVC简单入门

    一.MVC简单入门 1.1.MVC概念 视图(View) 代表用户交互界面,对于Web应用来说,可以概括为HTML界面,但有可能为XHTML.XML和Applet. 模型(Model) 表示用户对其数 ...

随机推荐

  1. Kubernetes Deployment控制器(二十)

    前面我们学习了 ReplicaSet 控制器,了解到该控制器是用来维护集群中运行的 Pod 数量的,但是往往在实际操作的时候,我们反而不会去直接使用 RS,而是会使用更上层的控制器,比如我们今天要学习 ...

  2. 揭秘 FineVideo 数据集构建的背后的秘密

    开放视频数据集稀缺,因此减缓了开源视频 AI 的发展.为此,我们构建了 FineVideo,这是一个包含 43,000 个视频的数据集,总时长为 3,400 小时,并带有丰富的描述.叙事细节.场景分割 ...

  3. SQL注入利用及绕过总结

    SQL注入及绕过姿势总结 概述 SQL注入指用户输入的参数可控且没有被过滤,攻击者输入的恶意代码被传到后端与SQL语句一起构造并在数据库中执行 不同数据库的语法可能存在差异,以MySQL为例,其他差异 ...

  4. 没想到,Python 还可以制作 Web 可视化页面!

    一谈到Web页面,可能大家首先想到就是HTML,CSS或JavaScript. 本次小F就给大家介绍一下如何用Python制作一个数据可视化网页,使用到的是Streamlit库. 轻松的将一个Exce ...

  5. 网页转换为PDF的方法 Python

    前言 近期有些文档是在网站上的,量非常大.加之对于纸质书的喜爱,想把他们整合到一个PDF文档中,然后交由拼多多的老熟人打印店给打一下. 但是这个网站网页转PDF有很多在线网站可以用,不过只能转一个页面 ...

  6. 【小记】Docker容器间SSH公钥自动交换实现免密登录的一次尝试

    咋想到这茬了 最近开始忙毕设的事儿了,想部署个伪分布式的Spark + Hadoop集群来进行测试.思来考去,最终咱把目光放在了Docker上. 盘了两天,发现这玩意意外的有趣,镜像构建好后开箱即用, ...

  7. 解密prompt系列41. GraphRAG真的是Silver Bullet?

    这一章我们介绍GraphRAG范式,算着时间也是该到图谱了,NLP每一轮新模型出来后,往往都是先研究微调,然后各种预训练方案,接着琢磨数据,各种主动学习半监督,弱监督,无监督,再之后就到图谱和对抗学习 ...

  8. vue项目获取富文本编辑器wangEditor内容导出为word(html转word格式并下载)

    一.开发问题 html-doc-js,只能处理简单的富文本导出为word,对于编辑器中部分图文和样式会不生效,而wangEditor默认设置有下图这么多,所以要自己尝试找替代方案去解决html内容. ...

  9. vim粘贴文件格式不乱

    vim粘贴防止格式乱,配置以下命令然后在粘贴,即可~ :set paste

  10. 基于Java+SpringBoot+Mysql实现的古诗词平台功能设计与实现二

    一.前言介绍: 1.1 项目摘要 随着信息技术的迅猛发展和数字化时代的到来,传统文化与现代科技的融合已成为一种趋势.古诗词作为中华民族的文化瑰宝,具有深厚的历史底蕴和独特的艺术魅力.然而,在现代社会中 ...