文档章节

shiro学习之配置

GITTODO
 GITTODO
发布于 2016/01/31 15:31
字数 1782
阅读 175
收藏 4
点赞 1
评论 0

shiro学习之配置

一、简介

    shiro的配置主要分为两部分:权限(包括:账户、密码、角色、资源),模块(包括:认证、授权、session、cache、web)。在学习的过程中千万要分开理解,不然很容易混淆。在单独使用shiro的时候,我们需要配置xxx.ini文件来修改我们需要的信息。shiro的每个部分都是以[xxx]开始,其中[main]是模块配置,后面的[users],[roles],[urls]则是权限关配置。

一、权限配置

[users]
#提供了对用户/密码及其角色的配置,用户名=密码,角色1,角色2
username=password,role1,role2

[roles]
#提供了角色及权限之间关系的配置,角色=权限1,权限2
role1=permission1,permission2

    [users]:下面配置的是账户、密码,以及该账户的权限。

    [roles]:对应每一个角色的访问资源。

    (shiro采取的是:一个用户对应多个角色,一个角色对应多个资源)

二、模块配置

    a)先看一下 配置 的代码:这段代码直接通过源码实现来一步步new出来的。

//全局sercurityManager
DefaultSecurityManager securityManager = new DefaultSecurityManager();

//设置authenticator
ModularRealmAuthenticator authenticator = new ModularRealmAuthenticator();
authenticator.setAuthenticationStrategy(new AtLeastOneSuccessfulStrategy());
securityManager.setAuthenticator(authenticator);

//设置authorizer
ModularRealmAuthorizer authorizer = new ModularRealmAuthorizer();
authorizer.setPermissionResolver(new WildcardPermissionResolver());
securityManager.setAuthorizer(authorizer);

//设置Realm
DruidDataSource ds = new DruidDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/shiro");
ds.setUsername("root");
ds.setPassword("");

JdbcRealm jdbcRealm = new JdbcRealm();
jdbcRealm.setDataSource(ds);
jdbcRealm.setPermissionsLookupEnabled(true);
securityManager.setRealms(Arrays.asList((Realm) jdbcRealm));

//将SecurityManager设置到SecurityUtils 方便全局使用
SecurityUtils.setSecurityManager(securityManager);

//登录
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken("zhang", "123");
subject.login(token);
Assert.assertTrue(subject.isAuthenticated());

    b)介绍:

        通过上面这段代码大家可以看见几个主要的实现模块:SecurityManager、Realm等等。这是通过new的方式来实现的,那我们平时的配置又有什么用呢?为了将这些模块组装起来,并且做个一个高可用,低耦合、高扩展性的框架。shiro里面采用了 IOC 的方式,通过JVM的功能实现的java 反射,来组装实现低耦合、高可扩展性。在使用者自己开发的扩展中,通过实现shiro提供的接口完成自己的功能,然后通过配置文件替换默认的功能(shiro的源码很经典,建议大家多读读)。

    c)主要模块实现

        1、用户认证: 认证realm、AuthenticationStrategy(这个主要、针对多个realm)

            认证realm的实现:实现realm接口。这里每一个realm都可以看作是一个元数据查询接口(可以是数据库、txt、redis)。

实现realm:
public class AuthenticationTest implements Realm {
	/**
	 * @see 实现一个认证:每一个realm都会和我们维护的数据联系
	 */
	// 认证
	public AuthenticationInfo getAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
		System.out.println("myRealm");
		String userName = (String) token.getPrincipal(); // 账户
		String password = new String((char[]) token.getCredentials()); // 密码
		if (!"userName".equals(userName)) {
			throw new UnknownAccountException();// 账户错误
		}
		if (!"password".equals(password)) {
			throw new IncorrectCredentialsException();// 密码错误
		}
		return new SimpleAuthenticationInfo(userName, password, getName());
	}

	// 每个realm都有一个名称
	public String getName() {
		return "myrealm";
	}

	// 是否支持token
	public boolean supports(AuthenticationToken token) {
		return token instanceof UsernamePasswordToken;
	}

}
配置:ini

##自定义realm全限名####
myRealm1=com.fxl.Test.LearnOne.shiro.authentication.AuthenticationTest
###注入#####
securityManager.realms=$myRealm1

      AuthenticationStrategy的类型:当有多个realm的时候,例如有多个数据元,我们就需要知道哪一个正确才能完成认证,也就是认证策略。官方提供了3种,满足我们大部分需要。

            FirstSuccessfulStrategy:只要有一个Realm验证成功即可,只返回第一个Realm身份验证成功的认证信息,其他的忽略;

            AtLeastOneSuccessfulStrategy:只要有一个Realm验证成功即可,和FirstSuccessfulStrategy不同,返回所有Realm身份验证成功的认证信息;(默认)

            AllSuccessfulStrategy:所有Realm验证成功才算成功,且返回所有Realm身份验证成功的认证信息,如果有一个失败就失败了。

修改为所用都成功:
allSuccessfulStrategy=org.apache.shiro.authc.pam.AllSuccessfulStrategy  
securityManager.authenticator.authenticationStrategy=$allSuccessfulStrategy

        2、授权:一个subject的权限获取和每一次访问的权限验证,都会使用到authorization模块。

1、默认实现:
默认的资源字符串:资源标识符:操作:对象实例
eg:
单资源单权限:user:update:5 表示的是:用户:修改:角色5
单资源多权限:user:update,create:5
单资源所有权限:user:*:5

authorization的realm实现:继承 authorizingRealm
public class Authoriation extends AuthorizingRealm {
	/***
	 * @see 权限查询
	 */
	@Override
	protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) {
		SimpleAuthorizationInfo sai = new SimpleAuthorizationInfo();
		// 添加角色
		sai.addRole("admim"); // 单角色
		List<String> roles = new ArrayList<String>();// 多角色
		roles.add("admin1");
		roles.add("admin2");
		sai.addRoles(roles);

		// 添加资源权限
		sai.addStringPermission("user:update");
		List<String> permissions = new ArrayList<String>();// 多角色
		permissions.add("user:create");
		permissions.add("user:delete");
		sai.addStringPermissions(permissions);
		return sai;
	}
	/**
	 * @see 认证查询
	 */
	@Override
	protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken arg0) throws AuthenticationException {
		// TODO Auto-generated method stub
		return null;
	}
}
配置ini:
############# authorization ################
myRealm2=com.fxl.Test.LearnOne.shiro.authorization.AuthoriationTest
securityManager.realms=$myRealm2

2、自定义的资源字符串实现:
需要实现3个接口:permission,permissionResolver,rolePermissionResolver 
permission:定义了字符串的 组成方式 和 对比方式
permissionResolver:根据字符串的组成方式来实现不同的permission对象.
rolePermissionResolver:通过不同的角色来获取不同的permission对戏。
ps:每一permission都是一个对象实例,所以需要我们实现permission接口,需要我们通过组成方式实现perimission。
    eg:permission1: +资源标识符+操作+对象ID
       permission2: -资源标识符+操作+对象ID

配置的文件(ini):
#################自定义的 permission############
authorizer=org.apache.shiro.authz.ModularRealmAuthorizer

#自定义permissionResolver  
permissionResolver=com.fxl.Test.LearnOne.shiro.authorization.MyRolePermissionReslover  
authorizer.permissionResolver=$permissionResolver  

#自定义rolePermissionResolver  
rolePermissionResolver=com.fxl.Test.LearnOne.shiro.authorization.MyPermissionReslover  
authorizer.rolePermissionResolver=$rolePermissionResolver 

securityManager.authorizer=$authorizer

        3、realm:realm算是authencation和authorization模块的一部分。单独拿出来是因为我们可以通过实现直接继承一个authorizingRealm来实现认证和授权。

public class RealmTest extends AuthorizingRealm {
	/***
	 * @see 权限查询
	 */
	@Override
	protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) {
		SimpleAuthorizationInfo sai = new SimpleAuthorizationInfo();
		// 添加角色
		sai.addRole("admim"); // 单角色
		List<String> roles = new ArrayList<String>();// 多角色
		roles.add("admin1");
		roles.add("admin2");
		sai.addRoles(roles);

		// 添加资源权限
		sai.addStringPermission("user:update");
		List<String> permissions = new ArrayList<String>();// 多角色
		permissions.add("user:create");
		permissions.add("user:delete");
		sai.addStringPermissions(permissions);
		return sai;
	}
	/**
	 * @see 认证查询
	 */
	@Override
	protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
		System.out.println("myRealm");
		String userName = (String) token.getPrincipal(); // 账户
		String password = new String((char[]) token.getCredentials()); // 密码
		if (!"userName".equals(userName)) {
			throw new UnknownAccountException();// 账户错误
		}
		if (!"password".equals(password)) {
			throw new IncorrectCredentialsException();// 密码错误
		}
		return new SimpleAuthenticationInfo(userName, password, "myRealm");
	}
}

配置:
############# authorization ################
myRealm3=com.fxl.Test.LearnOne.shiro.authorization.RealmTest 
securityManager.realms=$myRealm2

        3、cache:由于每一次授权、session都会查询一次元数据(例如:从数据库中查询授权字符串)。很影响性能,cache就是我们的不二之选。shiro默认使用的EHchache,当然也可以通过实现接口来实现

缓存主要用在realm查询和session中:
1、扩展接口:
cache:shiro不同模块调用的通用接口。如果我需要自己实现cache,则需要将这些接口都换掉
CacheManager:获取一个cache对象。实现这个接口,可以从第三方接口中获取cache。
CacheManagerAware:注入CacheManager,在authencation、authorization、sessionDAO中都有这个接口实现。然后通过IOC,注入我们自己的cache。

2、默认cache:Ehcache

3、配置:
realm:认证、授权
myRealm3=com.fxl.Test.LearnOne.shiro.authorization.RealmTest 
myRealm3.credentialsMatcher=$credentialsMatcher
#######开启cacheManager#######
myRealm3.cachingEnabled=true
myRealm3.authenticationCachingEnabled=true
myRealm3.authenticationCacheName=authenticationCache
myRealm3.authorizationCachingEnabled=true
myRealm3.authorizationCacheName=authorizationCache

securityManager.realms=$myRealm3

##########设置cacheManager################
cacheManager=org.apache.shiro.cache.ehcache.EhCacheManager
cacheManager.cacheManagerConfigFile=classpath:shiro-ehcache.xml
securityManager.cacheManager=$cacheManager;

session配置cache:
##################开启session的cacheManager#################
sessionManager=org.apache.shiro.session.mgt.DefaultSessionManager
securityManager.sessionManager=$sessionManager;

#####################实现sessionDAO的cacheManager###########
sessionDAO=com.fxl.Test.LearnOne.shiro.authorization.session.dao.MySessionDAO
sessionDAO.activeSessionsCacheName=shiro-activeSessionCache;

        


© 著作权归作者所有

共有 人打赏支持
GITTODO
粉丝 23
博文 136
码字总数 197485
作品 0
程序员
Spring+Shiro+CAS整合配置笔记

一、前言 Apache Shiro与Spring Security一样是Java的一个安全框架。那为什么与Spring整合却用Shiro?不要问为什么,任性!开个玩笑:D 其实我个人是认为Spring Security太过于笨重,要写太多...

qllinhongyu ⋅ 2014/12/09 ⋅ 0

Shiro学习系列教程四:集成web(二)

本讲主要内容: 1:shiro对访问URL可使用通配符进行匹配 2:shiro标签的使用 3:shiro会话的机制 URL匹配方式: 演示: 现在shiro.ini配置的路径为: 直接访问/admin Ok.没问题。 那么我们访...

799879287 ⋅ 2017/10/21 ⋅ 0

shiro之web配置

shiro之web配置 一、简介 通过配置来学习shiro,或者说通过配置来学习框架和软件,可以帮我们记忆这个框架或软件的核心功能有哪些,然后是通过什么模块来实现这些功能。本篇,我们学习shiro...

GITTODO ⋅ 2016/01/31 ⋅ 0

jfinal整合shiro回顾

目前jfinal使用shiro进行身份验证和授权的后台实现已完成,现在我再来总结下学习过程及代码实现过程。最近半年多项目开发都用.net,但又不甘心用了一年多的java,jfinal就这样被废弃,所以就...

我是程序yuan ⋅ 2017/08/30 ⋅ 4

Shiro项目启动报错org.apache.shiro.session.UnknownSessionException: There is no session with id

学习Shiro中,第一次搭建一个项目,使用Spring、Springmvc和Shiro,项目启动后报错org.apache.shiro.session.UnknownSessionException: There is no session with id。 2016-12-29 14:21:58,......

airtwqF ⋅ 2016/12/29 ⋅ 1

SpringMVC+Spring Data JPA+Shiro+EasyUI简单权限管理系统

概述 一直想做一个管理系统,希望它简洁,能做一个demo使用。以后在研究学习的时候,可以在此基础上增加代码。我觉得权限管理系统很值得做,因为涉及关系数据库模式的设计,能学到很多东西。...

huoyoung ⋅ 2016/06/17 ⋅ 0

Shiro之CAS单点登录-yellowcong

配置单点登录,有点坑的是,我将Session存在了缓存中,导致我每次登录的时候,都不去cas验证中心,我就感觉很无语,后来将sessionManager删除后,就好用了,太坑了,这问题坑了一天多。实现C...

yelllowcong ⋅ 2017/12/21 ⋅ 0

Shiro 学习应用

和 Spring Security 一样,Shiro 也属于权限安全框架。和 Spring Security 相比,Shiro 更简单,学习曲线更低。关于 Shiro 的一系列特征及优点,很多文章已有列举,这里不再逐一赘述。这里记...

sp42 ⋅ 2014/05/05 ⋅ 0

spring shiro框架的学习记录1

一、shiro的出处: 官方网站:http://shiro.apache.org 相关参考博文: http://my.oschina.net/u/866794/blog/107756 http://www.ibm.com/developerworks/cn/java/j-lo-shiro/ http://hpuzhu......

今夜吴眠 ⋅ 2013/12/06 ⋅ 0

轩少/spring-shiro-training

Spring Shiro学习系统 简介 基于springmvc、spring、mybatis-plus、shiro、easyui、Log4j2简单实用的权限系统。 界面基于EasyUI,图标采用较为开放的(MIT协议)。 :http://git.oschina.net/...

轩少 ⋅ 2015/12/07 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

解决yum安装报错Protected multilib versions

使用yum安装报错Protected multilib versions原因是因为多个库不能共存,不过更新的话也并不行,但是可以在安装命令后面加上如下一段命令: --setopt=protected_multilib=false 案例: 比如需...

北岩 ⋅ 27分钟前 ⋅ 0

为什么要学习Typescript???

简单来说 目前的typescript就是未来的javascript 为什么?? 这要从ECMA-262标准的第4版说起 对了 我们说的ES5 其实是ECMAScript3.1这个替代性建议被扶正了而已... 那么 第4版标准是什么? 看看...

hang1989 ⋅ 31分钟前 ⋅ 0

linux安装ipfs

一、下载ipfs # cd /usr/local/ipfs/ # wget https://dist.ipfs.io/go-ipfs/v0.4.15/go-ipfs_v0.4.15_linux-amd64.tar.gz # tar -zxvf go-ipfs_v0.4.15_linux-amd64.tar.gz 二、安装ipfs # ......

八戒八戒八戒 ⋅ 37分钟前 ⋅ 0

jvm程序执行慢诊断手册

生产环境最多的几种事故之一就是程序执行慢,如果是web服务的话,表现就是响应时间长。本文分享,从业多年形成的排查守则。 诊断步骤 系统资源查看 首先是系统资源查看,而且必须是在第一步。...

xpbob ⋅ 38分钟前 ⋅ 0

YII2 advanced 高级版本项目搭建-添加API应用以及多应用

一、YII安裝 安裝yii可以用composer安裝,也可以在yii中文社区下载归档文件安装 composer安装就不介绍了,因为要安装composer,比较麻烦,当然安装了composer是最好的,以后安装yii的插件要用...

botkenni ⋅ 38分钟前 ⋅ 0

在jdk1.8的环境下模拟永久代内存溢出

相信不少小伙伴在看深入理解Java虚拟机的时候,作者给我们举例一个demo来发生PermGen space 1、通过List不断添加String.intern(); 2、通过设置对应的-XX:PermSize与-XX:MaxPermSize(更快看到...

虾几把写 ⋅ 今天 ⋅ 0

开发OpenDaylight组件的完整流程

在前面介绍学习了OpenDaylight的几个重要模块后,这里再来介绍下完整开发一个模块的过程。 OSGI的bundles提供被其他OSGI组件调用的服务。这个教程中展示的是Data Packet Service去解析数据包...

wangxuwei ⋅ 今天 ⋅ 0

Java序列化和反序列化

1、什么是序列化和反序列化 序列化:把对象转换为字节序列的过程。 反序列化:把字节序列恢复成对象的过程。 2、被序列化的类需要实现serializable接口,只是为了标注该对象是可以被序列化的...

IT-Mamba ⋅ 今天 ⋅ 0

流式构建原理

流式构建需要达到分钟级的数据更新频率,Kylin采用类似于Spark Streaming的做法,每隔数分钟进行一次微构建。这边的构建需要考虑到一个延迟因素,分布式网络存在延迟等因素,该时间段的数据有...

无精疯 ⋅ 今天 ⋅ 0

在maven项目工程编写solr代码,需要的依赖

solrJ <dependency> <groupId>org.apache.solr</groupId> <artifactId>solr-solrj</artifactId> <version>6.6.2</version> </dependency> <dependency> <groupId>org.apache.httpcomponents<......

爱运动的小乌龟 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部