Apache Shiro是一个强大而灵活的开源安全框架,它能够干净利落地处理身份认证,授权,企业会话管理和加密。

以下是你可以用 Apache Shiro所做的事情:

1、验证用户

2、 对用户执行访问控制,如:

判断用户是否拥有角色admin。

判断用户是否拥有访问的权限

3、在任何环境下使用 Session API。例如CS程序。

4、可以使用多个用户数据源。例如一个是oracle用户库,另外一个是mysql用户库。

5、单点登录(SSO)功能。

6、 “Remember Me”服务 ,类似购物车的功能,shiro官方建议开启。

Shiro的4大部分——身份验证,授权,会话管理和加密

·  Authentication:身份验证,简称“登录”。

·  Authorization:授权,给用户分配角色或者权限资源

·  Session Management:用户session管理器,可以让CS程序也使用session来控制权限

·  Cryptography:把JDK中复杂的密码加密方式进行封装。

Subject 是与程序进行交互的对象,可以是人也可以是服务或者其他,通常就理解为用户。

所有Subject 实例都必须绑定到一个SecurityManager上。我们与一个 Subject 交互,运行时shiro会自动转化为与 SecurityManager交互的特定 subject的交互

1.Subject(org.apache.shiro.subject.Subject):

简称用户

2.SecurityManager(org.apache.shiro.mgt.SecurityManager)

如上所述,SecurityManager是shiro的核心,协调shiro的各个组件

3.Authenticator(org.apache.shiro.authc.Authenticator):

登录控制

注:Authentication Strategy

(org.apache.shiro.authc.pam.AuthenticationStrategy)

如果存在多个realm,则接口AuthenticationStrategy会确定什么样算是登录成功(例如,如果一个Realm成功,而其他的均失败,是否登录成功?)

4.Authorizer(org.apache.shiro.authz.Authorizer) :

决定subject能拥有什么样角色或者权限。

5.SessionManager(org.apache.shiro.session.SessionManager) :

创建和管理用户session。通过设置这个管理器,shiro可以在任何环境下使用session。

6.CacheManager(org.apahce.shiro.cache.CacheManager) :

缓存管理器,可以减少不必要的后台访问。提高应用效率,增加用户体验。

7.Cryptography(org.apache.shiro.crypto.*) :

Shiro的api大幅度简化java api中繁琐的密码加密。

8.Realms(org.apache.shiro.realm.Realm) :

程序与安全数据的桥梁

Shiro的配置

注:这里只介绍spring配置模式。

因为官方例子虽然中有更加简洁的ini配置形式,但是使用ini配置无法与spring整合。而且两种配置方法一样,只是格式不一样。

与spring整合需要的jar包

Jar包名称

版本

核心包shiro-core

1.2.0

Web相关包shiro-web

1.2.0

缓存包shiro-ehcache

1.2.0

与spring整合包shiro-spring

1.2.0

Ehcache缓存核心包ehcache-core

2.5.3

Shiro自身日志包slf4j-jdk14

1.6.4

2.在Spring的applicationContext.xml中添加shiro配置

securityManager:这个属性是必须的。

loginUrl :没有登录的用户请求需要登录的页面时自动跳转到登录页面,不是必须的属性,不输入地址的话会自动寻找项目web项目的根目录下的”/login.jsp”页面。

successUrl :登录成功默认跳转页面,不配置则跳转至”/”。如果登陆前点击的一个需要登录的页面,则在登录自动跳转到那个需要登录的页面。不跳转到此

unauthorizedUrl :没有权限默认跳转的页面

过滤器简称

对应的java

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

logout

org.apache.shiro.web.filter.authc.LogoutFilter

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

authc:例如/admins/user/**=authc表示需要认证(登录)才能使用,没有参数

roles:例子/admins/user/**=roles[admin],参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,当有多个参数时,例如admins/user/**=roles["admin,guest"],每个参数通过才算通过,相当于hasAllRoles()方法。

perms:例子/admins/user/**=perms[user:add:*],参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,例如/admins/user/**=perms["user:add:*,user:modify:*"],当有多个参数时必须每个参数都通过才通过,想当于isPermitedAll()方法。

rest:例子/admins/user/**=rest[user],根据请求的方法,相当于/admins/user/**=perms[user:method] ,其中method为post,get,delete等。

port:例子/admins/user/**=port[8081],当请求的url的端口不是8081是跳转到schemal://serverName:8081?queryString,其中schmal是协议http或https等,serverName是你访问的host,8081是url配置里port的端口,queryString

是你访问的url里的?后面的参数。

authcBasic:例如/admins/user/**=authcBasic没有参数表示httpBasic认证

ssl:例子/admins/user/**=ssl没有参数,表示安全的url请求,协议为https

user:例如/admins/user/**=user没有参数表示必须存在用户,当登入操作时不做检查

注:anon,authcBasic,auchc,user是认证过滤器,

perms,roles,ssl,rest,port是授权过滤器

3.在applicationContext.xml中添加securityManagerper配置

4.配置bosRealm

5.配置shiro注解模式

@RequiresAuthentication

验证用户是否登录,等同于方法subject.isAuthenticated() 结果为true时

@ RequiresUser

验证用户是否被记忆,user有两种含义:

一种是成功登录的(subject.isAuthenticated() 结果为true);

另外一种是被记忆的( subject.isRemembered()结果为true)。

@ RequiresGuest

验证是否是一个guest的请求,与@ RequiresUser完全相反。

换言之,RequiresUser  == ! RequiresGuest 。

此时subject.getPrincipal() 结果为null.

三.简单扩展

  1. 自定义realm:

<!--自定义的myRealm 继承自AuthorizingRealm,也可以选择shiro提供的 -->

<bean id="myRealm" class="com.yada.shiro.MyReam"></bean>

//这是授权方法

protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {

String userName = (String) getAvailablePrincipal(principals);

//TODO 通过用户名获得用户的所有资源,并把资源存入info

…………………….

SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();

info.setStringPermissions(set集合);

info.setRoles(set集合);

info.setObjectPermissions(set集合);

   return info;

}

//这是认证方法

protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {

//token中储存着输入的用户名和密码

UsernamePasswordToken upToken = (UsernamePasswordToken)token;

//获得用户名与密码

String username = upToken.getUsername();

String password = String.valueOf(upToken.getPassword());

//TODO 与数据库中用户名和密码进行比对。比对成功则返回info,比对失败则抛出对应信息的异常AuthenticationException

         …………………..

SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(username, password .toCharArray(),getName());

         return info;

}

2、自定义登录

//创建用户名和密码的令牌

UsernamePasswordToken token=new UsernamePasswordToken(user.getUserName(),user.getPassWord());

//记录该令牌,如果不记录则类似购物车功能不能使用。

token.setRememberMe(true);

//subject理解成权限对象。类似user

Subject subject = SecurityUtils.getSubject();

try {

subject.login(token);

} catch (UnknownAccountException ex) {//用户名没有找到。

} catch (IncorrectCredentialsException ex) {//用户名密码不匹配。

}catch (AuthenticationException e) {//其他的登录错误

}

//验证是否成功登录的方法

if (subject.isAuthenticated()) {

}

3、自定义登出

Subject subject = SecurityUtils.getSubject();

subject.logout();

  1. 基于编码的角色授权实现

Subject currentUser = SecurityUtils.getSubject();

if (currentUser.hasRole("administrator")) {

//拥有角色administrator

else {

//没有角色处理

}

断言方式控制

Subject currentUser = SecurityUtils.getSubject();

//如果没有角色admin,则会抛出异常,someMethod()也不会被执行

currentUser.checkRole(“admin");

someMethod();

  1. 基于编码的资源授权实现

Subject currentUser = SecurityUtils.getSubject();

if (currentUser.isPermitted("permssion:look")) {

//有资源权限

else {

//没有权限

}

断言方式控制

Subject currentUser = SecurityUtils.getSubject();

//如果没有资源权限则会抛出异常。

currentUser.checkPermission("permssion:look");

someMethod();

  1. 在JSP上的TAG实现

标签名称

标签条件(均是显示标签内容)

<shiro:authenticated>

登录之后

<shiro:notAuthenticated>

不在登录状态时

<shiro:guest>

用户在没有RememberMe时

<shiro:user>

用户在RememberMe时

<shiro:hasAnyRoles name="abc,123" >

在有abc或者123角色时

<shiro:hasRole name="abc">

拥有角色abc

<shiro:lacksRole name="abc">

没有角色abc

<shiro:hasPermission name="abc">

拥有权限资源abc

<shiro:lacksPermission name="abc">

没有abc权限资源

<shiro:principal>

默认显示用户名称

7.

默认,添加或删除用户的角色 或资源 ,系统不需要重启,但是需要用户重新登录。

即用户的授权是首次登录后第一次访问需要权限页面时进行加载。

但是需要进行控制的权限资源,是在启动时就进行加载,如果要新增一个权限资源需要重启系统。

8.

Spring security 与apache shiro 差别:

a)      shiro配置更加容易理解,容易上手;security配置相对比较难懂。

b)      在spring的环境下,security整合性更好。Shiro对很多其他的框架兼容性更好,号称是无缝集成。

c)      shiro 不仅仅可以使用在web中,它可以工作在任何应用环境中。

d)      在集群会话时Shiro最重要的一个好处或许就是它的会话是独立于容器的。

e)      Shiro提供的密码加密使用起来非常方便。

9.

控制精度:

注解方式控制权限只能是在方法上控制,无法控制类级别访问。

过滤器方式控制是根据访问的URL进行控制。允许使用*匹配URL,所以可以进行粗粒度,也可以进行细粒度控制。

Java应用之shiro的更多相关文章

  1. Java环境下shiro的测试-认证与授权

    Java环境下shiro的测试 1.导入依赖的核心jar包 <dependency> <groupId>org.apache.shiro</groupId> < ...

  2. Java 权限框架 Shiro 实战二:与spring集成、filter机制

    转自:https://www.cnblogs.com/digdeep/archive/2015/07/04/4620471.html Shiro和Spring的集成,涉及到很多相关的配置,涉及到shi ...

  3. Java中SSM+Shiro系统登录验证码的实现方法

    1.验证码生成类: import java.util.Random; import java.awt.image.BufferedImage; import java.awt.Graphics; im ...

  4. Java安全之Shiro 550反序列化漏洞分析

    Java安全之Shiro 550反序列化漏洞分析 首发自安全客:Java安全之Shiro 550反序列化漏洞分析 0x00 前言 在近些时间基本都能在一些渗透或者是攻防演练中看到Shiro的身影,也是 ...

  5. Java 权限框架 Shiro 实战一:理论基础

    Apache Shiro 官网地址:http://shiro.apache.org/ Apache Shiro is a powerful and easy-to-use Java security ...

  6. 1.java安全框架SHIRO

    1. shiro介绍 Apache Shiro是一个强大且易用的java安全框架,执行身份验证.授权.密码和会话管理. 使用Shiro的易于理解的API,您可以快速.轻松地获得任何应用程序,从最小的移 ...

  7. java框架之shiro

    #shiro简介 一.简介 Apache Shiro 是一个强大而灵活的开源安全框架,可以用于应用程序的身份验证,授权,会话管理和加密. Authentication:有时也简称为“登录”,这是一个证 ...

  8. java安全框架shiro(一)

    第一个简单的案例 ,通过读取.ini文件的方式模拟登陆, 1.通过Factory工厂的getInstance()方法来获取SecurityManager的实例,实例化Factory需要一个ini文件的 ...

  9. 手把手实现Java权限(1)-Shiro介绍

    功能介绍 Authentication :身份认证/登录.验证用户是不是拥有对应的身份:  Authorization :授权,即权限验证.验证某个已认证的用户是否拥有某个权限:即推断用  户能否做事 ...

随机推荐

  1. Centos7离线安装redis

    1.1 下载.上传.解压redis4.0.11 下载地址:http://download.redis.io/releases/redis-4.0.11.tar.gz下载后上传到服务器上,并解压:备注: ...

  2. tensorflow创建自定义 Estimator

    https://www.tensorflow.org/guide/custom_estimators?hl=zh-cn 创建自定义 Estimator 本文档介绍了自定义 Estimator.具体而言 ...

  3. CentOS 7 安装 Oracle 11.2.0.4

    一.安装环境 CentOS Linux release 7.2.1511 (Core) Oracle Database 11g Release 2 (11.2.0.4) 二.安装前准备 2.1 修改主 ...

  4. --defaults-file 不能用?

    今天在测试mysql多实例时发现mysqld_safe --user --defaults-file 怎么都无法启动,后来发现是必须按顺序,先写--defaults-file才可以. mysqld_s ...

  5. AYUI第12个作品-英雄联盟-魔法少女的星光水晶2.0-WPF版本

    一下 内容基于AYUI6.7制作,主要3个大控件,1个 轮播预览,一个抽奖展示,一个是自己的抽中的历史展示,还有礼品领取,图片变成黑白的滤镜,滚动条网页方式布局 历时4天,制作效果如下: 由于自己爬了 ...

  6. Atitit s2018.5 s5 doc list on com pc.docx  v2

    Atitit s2018.5 s5  doc list on com pc.docx  Acc  112237553.docx Acc Acc  112237553.docx Acc baidu ne ...

  7. Unable to find IPv4-only network bridge for LXD.

    https://github.com/conjure-up/conjure-up/issues/1440It seems like the the installation is complainin ...

  8. jquery $('#form1').serialize()序列化提交表单

    1.$("#form1").serialize() 把form表单的值序列化成一个字符串,如username=admin&password=admin123 <for ...

  9. linux通用技巧集合

    1.将程序置为后台进程运行,关闭终端程序继续运行 nohup ./test.sh & 2.列出当前后台运行的进程列表包括进程id jobs -l 3.根据进程id杀掉该进程 kill - pi ...

  10. eclipse的debug模式下启动不了tomcat

    使用eclipse启动tomcat,正常模式下可以启动tomcat,却在debug模式下无法启动tomcat. 这个问题可能是由于eclipse和tomcat的交互而产生的,在以debug模式启动to ...