erp权限验证框架Shiro

 

权限验证框架Shiro

  1. Shiro简介

1.1. 什么是Shiro

Apache Shiro是一个强大易用的Java安全框架,提供了认证、授权、加密和会话管理等功能:

认证(Authentication):用户身份识别,常被称为用户“登录”,判断用户是否登陆,如果未登陆,则拦截其请求

授权(Authorization):访问控制。当用户登陆后,判断其身份是否有权限访问相应的资源,如果没有权限则拦截

密码加密(Cryptography):保护或隐藏数据防止被偷窃。将MD5进行二次封装,让其更加容易使用。注意MD5不可逆运算

会话管理(Session Management)

1.2. Shiro内置过滤器


anon


org.apache.shiro.web.filter.authc.AnonymousFilter


authc


org.apache.shiro.web.filter.authc.FormAuthenticationFilter


authcBasic


org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter


perms


org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter


port


org.apache.shiro.web.filter.authz.PortFilter


rest


org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter


roles


org.apache.shiro.web.filter.authz.RolesAuthorizationFilter


ssl


org.apache.shiro.web.filter.authz.SslFilter


user


org.apache.shiro.web.filter.authc.UserFilter

这些过滤器分为两组:

u 认证过滤器:anon(不认证也可以访问),authcBasic, authc(必须认证后才可

访问)

u 授权过滤器:perms(指定资源需要哪些权限才可以访问),Roles, ssl, rest, port

ERP项目中所使用到过滤器

anon: /admins/*=anon 没有参数,表示可以匿名使用

authc: /admins/user/*=authc

perms: /admins/user/*=perms[“权限名称”],参数可以写多个,多个之间用逗号

1.3. ERP整合Shiro

1) 添加依赖:

给erp_parent父工程添加依赖。

定义版本号:

2) 配置web.xml, 添加过滤器代理DelegatingFilterProxy,要放在struts2的核心过滤器之前

Spring提供的一个简便的过滤器处理方案,它将具体的操作交给内部的Filter对象delegate去处理,而这个delegate对象通过Spring的IOC容器获取,这里采用的是Spring的FactorBean的方式获取这个对象。

虽然中配置了这一个filter,但是它并没做任何实际的工作,而是把这个工作交由Spring容器中一个bean的id为shiroFilter的类,即ShiroFilterFactoryBean。

3) 添加shiro核心控制器的spring配置文件

复制资料中的applicationContext_shiro.xml文件到erp_web的资源目录下

4) 创建error.html

  1. 认证

2.1. 需求分析

判断当前用户是否登陆,如果没有登陆则跳转到登陆页面

2.2. 认证实现(重点)

2.2.1. Subject的login方法

修改LoginAction的checkUser方法。

步骤:

u 创建令牌:UsernamePasswordToken

u 获取subject

u 执行subject.login()方法

UsernamePasswordTokey是AuthenticationToken的子接口的实现类,它是对用户名和密码的封装。

Subject是对当前用户执行操作的封装,此处我们用它来执行登陆的操作。如果用户名和密码错误,login方法会抛出AuthenticationException异常

2.2.2. 自定义Realm

我们改用subject.login方法后,并不会调用登陆的业务层进行登陆的验证查询,即不会从数据库查找登陆的用户名和密码是否正确,而是将这项工作交给shiro去完成。那shiro是怎么知道登陆的用户名和密码是否正确的呢?其实它也需要用到我的登陆验证业务,这时它就得向“别人”打听一下,那就是Realm了。

真正实现登陆验证的是Realm,而shiro只是去调Realm

Realm: Realm充当了Shiro与应用安全数据间的“桥梁”或者“连接器”。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息。 
从这个意义上讲,Realm实质上是一个安全相关的DAO:它封装了数据源的连接细节,并在需要时将相关数据提供给Shiro。当配置Shiro时,你必须至少指定一个Realm,用于认证和(或)授权。配置多个Realm是可以的,但是至少需要一个。

1) 在erp_web子工程下创建包cn.itcast.erp.realm。

2) 创建ErpRealm类继承自AuthorizingRealm

3) 实现登陆验证

注入IEmpBiz

修改认证方法

配置ErpRealm, 在applicationContext_shiro.xml中配置

删除LoginAction中注入的IEmpBiz,配置文件也要同步删除。

2.2.3. Url访问规则

运行项目,发现无法登陆。通过查看浏览器的network项看到:发送login_checkUser请求的返回码为302,302的意思是页面跳转。由于我们配置了/*=authc,这个Url规则包含login_checkUser,所以无法执行并强行跳转到登陆页面。

修改applicationContext_shiro.xml中的配置

anon为内置的匿名认证过滤器,也就是不需要认证就可以访问。

authc需要认证后才能访问

2.2.4. 主角对象的提取

Shiro提供了会话管理机制,实际上我们自定义的realm的认证方法返回值对象中的主角对象就是登陆的用户,它可以代替我们之前存入session中的emp对象。我们可以通过subject的getPrincipal方法将其提取出来。

1) 修改LoginAction中的showName方法

2) 修改LoginAction中的退出登陆方法

3) 修改BaseAction中的getLoginUser方法

  1. 授权

3.1. 需求分析

授权就是通过设置规则,指定哪些URL需要哪些权限才可以访问

3.2. 授权的实现

3.2.1. 授权方法与配置(重点)

1) 编写授权方法

a) 注入IMenuBiz,用于查询当前登陆用户所具的菜单权限信息

b) 修改ErpRealm中的授权方法:

2) 配置授权控制规则

3) 小结:

u 授权方法的作用:告诉shiro当前用户有什么权限

u 配置信息的作用:告诉shiro什么资源有什么权限才可以访问

3.2.2. 自定义授权过滤器

当一个URL有多个权限需要访问的时候,我们应该怎么配置呢?

如果按下面的方法来配置

/orders.html=perms[“采购订单查询”]

/orders.html=perms[“采购订单审核”]

那么只有最后一条生效,前面的会被后面的覆盖掉

如果按下面的方法来配置

/orders.html=perms[“采购订单查询”,“采购订单审核”]

系统默认是同时具备这两个权限才可以访问此URL,而我们的需求是,只要有具备一种就可以访问此URL。系统使用的是and关系,而不是or关系,那我们如何让它实现or关系呢?这就需要我们去自定义授权过滤器啦

1) 创建自定义过滤器,继承自AuthorizationFilter

2) 配置过滤器

在applicationContext_shiro.xml中添加

在applicationContext_shiro.xml中添加

3) 配置或的关系

  1. 知识点总结

Shiro的三大核心组件:

Subject:正与系统进行交互的人,或某一个第三方服务。所有Subject实例都被绑定到(且这是必须的)一个SecurityManager上。

SecurityManager:Shiro架构的心脏,典型的Facade模式。用来协调内部各安全组件,管理内部组件实例,并通过它来提供安全管理的各种服务。当Shiro与一个Subject进行交互时,实质上是幕后的SecurityManager处理所有繁重的Subject安全操作。

Realms:本质上是一个特定安全的DAO。当配置Shiro时,必须指定至少一个Realm用来进行身份验证和/或授权。Shiro提供了多种可用的Realms来获取安全相关的数据。如关系数据库(JDBC),INI及属性文件等。可以定义自己Realm实现来代表自定义的数据源。

时间: 2024-08-01 08:56:44

erp权限验证框架Shiro的相关文章

简单两步快速实现shiro的配置和使用,包含登录验证、角色验证、权限验证以及shiro登录注销流程(基于spring的方式,使用maven构建)

前言: shiro因为其简单.可靠.实现方便而成为现在最常用的安全框架,那么这篇文章除了会用简洁明了的方式讲一下基于spring的shiro详细配置和登录注销功能使用之外,也会根据惯例在文章最后总结一下shiro的大致配置使用流程,希望本篇文章能够后能给大家一种原来shiro这么简单的错觉感觉. 注意:该篇文章的开始是建立在一个完备的spring+mybatis的开发环境中,除了shiro之外的配置基本不会涉及到.做好自己--eguid原创文章 一.依赖的jar包 本篇文章使用shiro-1.4

了解权限控制框架shiro 之实际应用.

Apache Shiro 1.权限控制分为 a.粗粒度 URL 级别权限控制     b.细粒度方法级别权限控制 2.使用shiro进行权限控制主要有四种主要方式 : a. 在程序中 通过 Subject 编程方式进行权限控制 b. 配置 Filter 实现 URL 级别粗粒度权限控制 c. 配置代理,基于注解实现细粒度权限控制 d. 在页面中使用 shiro 自定义标签实现 页面显示权限控制 3.shiro实际应用之基本配置: a.用父工程引入shiro b.配置web.xml c.配置app

权限控制框架Shiro简单介绍及配置实例

Shiro是什么 Apache Shiro是一个非常易用的Java安全框架它能提供验证.授权.加密和Session控制.Shiro非常轻量级而且API也非常易于理解可以使用Shiro完成从APP到企业级应用的所有权限控制. 宏观视图 从宏观来看Shiro架构中有3个重要概念Subjct.SecurityManager和Realms. Subject Subject实际上是正在执行的用户的抽象"用户"这里可以指自然人第三方服务代理账户或者其他. Subject被绑定在SecurityMa

Web用户的身份验证及WebApi权限验证流程的设计和实现

前言:Web 用户的身份验证,及页面操作权限验证是B/S系统的基础功能,一个功能复杂的业务应用系统,通过角色授权来控制用户访问,本文通过Form认证,Mvc的Controller基类及Action的权限验证来实现Web系统登录,Mvc前端权限校验以及WebApi服务端的访问校验功能. 1. Web Form认证介绍 Web应用的访问方式因为是基于浏览器的Http地址请求,所以需要验证用户身份的合法性.目前常见的方式是Form认证,其处理逻辑描述如下:1. 用户首先要在登录页面输入用户名和密码,然

Web用户的身份验证及WebApi权限验证流程的设计和实现(尾)

5. WebApi 服务端代码示例 5.1 控制器基类ApiControllerBase [csharp] view plaincopy /// /// Controller的基类,用于实现适合业务场景的基础功能 /// /// [BasicAuthentication] public abstract class ApiControllerBase : ApiController { } 5.2 权限属性BaseAuthenticationAttribute [csharp] view pla

WebApi权限验证流程的设计和实现

前言:Web 用户的身份验证,及页面操作权限验证是B/S系统的基础功能,一个功能复杂的业务应用系统,通过角色授权来控制用户访问,本文通过Form认证,Mvc的Controller基类及Action的权限验证来实现Web系统登录,Mvc前端权限校验以及WebApi服务端的访问校验功能. 1. Web Form认证介绍 Web应用的访问方式因为是基于浏览器的Http地址请求,所以需要验证用户身份的合法性.目前常见的方式是Form认证,其处理逻辑描述如下:1. 用户首先要在登录页面输入用户名和密码,然

[置顶] Web用户的身份验证及WebApi权限验证流程的设计和实现

转发 http://blog.csdn.net/besley/article/details/8516894 [置顶] Web用户的身份验证及WebApi权限验证流程的设计和实现 2013-01-18 13:19 22755人阅读 评论(19) 收藏 举报  分类: Asp.net Web技术(9)  WebAPI(3)  MVC(6)  版权声明:本文为博主原创文章,未经博主允许不得转载. 前言:Web 用户的身份验证,及页面操作权限验证是B/S系统的基础功能,一个功能复杂的业务应用系统,通过

Shiro权限验证代码记录,正确找到shiro框架在什么地方做了权限识别

权限验证方式的验证代码: org.apache.shiro.web.servlet.AdviceFilter这个类是所有shiro框架提供的默认权限验证实例类的父类 验证代码: public void doFilterInternal(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException { Exception exception = nu

java企业级通用权限安全框架源码 SpringMVC mybatis or hibernate+ehcache shiro druid bootstrap HTML5

开发快报: 页面打印功能,websocket 强制下线功能,玩转websocket技术  [金牌] 获取[下载地址]   QQ: 313596790 A 代码生成器(开发利器);      增删改查的处理类,service层,mybatis的xml,SQL( mysql   和oracle)脚本,   jsp页面 都生成    就不用写搬砖的代码了,生成的放到项目里,可以直接运行 B 阿里巴巴数据库连接池druid;   数据库连接池  阿里巴巴的 druid.Druid在监控.可扩展性.稳定性