Shiro Review——自定义Realm实现认证

一,自定义Realm

  在之前,使用过下面的ini文件进行认证测试:

#对用户信息进行配置
[users]
#用户名跟密码
zhangsan=111111
lisi=111111

  里面用户的认证信息是写死的,so,now ,来测试下使用自定义Realm来从我们的DB读取User信息,完成用户认证。

  首先大致看下Realm的类层级关系:

   比如,我们之前使用ini文件中的users配置用户名跟密码的时候,认证和时候使用的Realm就是IniRealm,比如里面的JdbcRealm,我们可以在数据库里面存储一张表用来认证。。。通常我们自定义Realm继承AuthorizingRealm。

 

/**
 * 自定义Realm
 * @author LiuHuiChao
 *
 */
public class CustomRealm extends AuthorizingRealm{

	@Override
	public void setName(String name) {
		super.setName("customName");
	}

	/**
	 * 认证方法
	 */
	@Override
	protected AuthenticationInfo doGetAuthenticationInfo(
			AuthenticationToken token) throws AuthenticationException {
		//1,从token中取出用户身份信息
		String userCode=(String)token.getPrincipal();

		//2,根据用户输入的账号从数据库查询
		String password="111111";//模拟从库里查询到的密码

		//2--1,查询不到返回null
		//2--2,查询到返回AuthenticationInfo
		SimpleAuthenticationInfo simpleAuthenticationInfo=new SimpleAuthenticationInfo(userCode,password,this.getName());

		return simpleAuthenticationInfo;
	}

	/**
	 * 授权方法
	 */
	@Override
	protected AuthorizationInfo doGetAuthorizationInfo(
			PrincipalCollection principals) {
		return null;
	}
}

  之后加入一个shiro-realm.ini配置文件:

[main]
#自定义realm
customRealm=cn.itcast.shiro.realm.CustomRealm
#将realm设置到securityManager
securityManager.realms=$customRealm

  测试代码:

@Test
	public void testCustomRealm() {
		// 读取配置文件,初始化SecurityManager工厂
		Factory<SecurityManager> factory = new IniSecurityManagerFactory(
				"classpath:shiro-realm.ini");
		// 创建SecurityManager
		SecurityManager securityManager = factory.getInstance();

		// 将SecurityManager设置到当前的运行环境中
		SecurityUtils.setSecurityManager(securityManager);

		// 从SecurityUtils构造创建一个subject
		Subject subject = SecurityUtils.getSubject();

		// 在提交认证前,需要准备token
		UsernamePasswordToken token = new UsernamePasswordToken("zhangsan",
				"111111");

		// 执行认证提交
		try {
			subject.login(token);
		} catch (AuthenticationException e) {
			e.printStackTrace();
		}

		boolean IsAuthenticated = subject.isAuthenticated();// 是否认证通过

		System.out.println(IsAuthenticated); // ture

		// 执行退出操作
		subject.logout();

		// 是否认证通过
		System.out.println(subject.isAuthenticated()); // false

	}

ok!!!!~~~

二,自定义Realm支持散列密码验证

  在上面的realm进行认证过程中,我们从数据库取出的密码是明文的,这样还是蛮不安全的,正常做法是存入的密码是加密过的,在进行用户认证的时候,对比加密后的密码。

    首先来看shrio框架中为我们提供的两个常用散列类:

   

public static void main(String[] args) {

		String source="111111";
		String salt="bcss";
		int hashCount=2;
		//散列一次:210cadc20323b04834132b899a5c2c07
		//散列二次:000d9f1f8ce13a0fe52dd4456897eb88

		//构造方法中:
			//第一个参数:明文,原始密码
			//第二个参数:盐,使用随机数
			//第三个参数:散列的次数,比如散列两次,相当于md5(md5(...))
		Md5Hash md5Hash=new Md5Hash(source,salt,hashCount);
		System.out.println(md5Hash.toString());

		//第一个参数:散列算法
		SimpleHash simpleHash=new SimpleHash("md5",source,salt,hashCount);
		System.out.println(simpleHash.toString());

	}

 

    我们为  密码明文+salt=>>>>得出密文。这种加盐散列的方式可以防止暴力猜测带来的密码破解。

 

    这样,我们的realm认证方法就变成了:

  

/**
	 * 认证方法
	 */
	@Override
	protected AuthenticationInfo doGetAuthenticationInfo(
			AuthenticationToken token) throws AuthenticationException {
		//1,从token中取出用户身份信息
		String userCode=(String)token.getPrincipal();

		//2,根据用户输入的账号从数据库查询
		String password="210cadc20323b04834132b899a5c2c07";//模拟从库里查询到的密码
		String salt="bcss"; //从数据库获取的salt

		//2--1,查询不到返回null
		//2--2,查询到返回AuthenticationInfo
		//SimpleAuthenticationInfo simpleAuthenticationInfo=new SimpleAuthenticationInfo(userCode,password,this.getName());
		SimpleAuthenticationInfo simpleAuthenticationInfo=new SimpleAuthenticationInfo(userCode,password,ByteSource.Util.bytes(salt),this.getName());
		return simpleAuthenticationInfo;
	}

   为了使用md5进行,还需要在ini配置中加入:

[main]
#定义凭证匹配器
credentialsMatcher=org.apache.shiro.authc.credential.HashedCredentialsMatcher
#散列算法
credentialsMatcher.hashAlgorithmName=md5
#散列次数
credentialsMatcher.hashIterations=1

#将凭证匹配器设置到realm
customRealm=cn.itcast.shiro.realm.CustomRealmWithMd5
customRealm.credentialsMatcher=$credentialsMatcher
securityManager.realms=$customRealm
时间: 2024-11-10 00:42:28

Shiro Review——自定义Realm实现认证的相关文章

Shiro Review——自定义Realm实现授权

   在自定义Realm中,可以进对数据库的查询,将认证后的用户的资源权限全部查询出来. /** * 自定义Realm * @author LiuHuiChao * */ public class CustomRealm extends AuthorizingRealm{ @Override public void setName(String name) { super.setName("customName"); } /** * 认证方法 */ @Override protecte

shiro自定义Realm

1.1 自定义Realm 上边的程序使用的是shiro自带的IniRealm,IniRealm从ini配置文件中读取用户的信息,大部分情况下需要从系统的数据库中读取用户信息,所以需要自定义realm.分享牛系列,分享牛专栏,分享牛. 1.1.1 shiro提供的realm     最基础的是Realm接口,CachingRealm负责缓存处理,AuthenticationRealm负责认证,AuthorizingRealm负责授权,通常自定义的realm继承AuthorizingRealm. 1

权限框架 - shiro 自定义realm

上篇文章中是使用的默认realm来实现的简单登录,这仅仅只是个demo,真正项目中使用肯定是需要连接数据库的 首先创建自定义realm文件,如下: 在shiro中注入自定义realm的完全限定类名: 1 [main] 2 # your custom realm path 3 fooRealm=com.lee.shiro.realm.FooRealm 4 # DI such as spring DI 5 securityManager.realms=$fooRealm 自定义realm认证: 1

Shiro Review——Shiro介绍

一,Shiro整体介绍             shiro是apache的一个开源框架,是一个权限管理的框架,实现 用户认证.用户授权.   spring中有spring security (原名Acegi),是一个权限框架,它和spring依赖过于紧密,没有shiro使用简单. shiro不依赖于spring,shiro不仅可以实现 web应用的权限管理,还可以实现c/s系统,分布式系统权限管理,shiro属于轻量框架,越来越多企业项目开始使用shiro.   使用shiro实现系统 的权限管

Shiro Review——使用ini文件进行授权测试

一,shiro授权 授权流程:   跟用户的认证流程类似,shrio在用户授权的时候,最后还是去Realm获取信息.    shiro的三种授权方式:   Shiro 支持三种方式的授权: 编程式:通过写if/else 授权代码块完成: Subject subject = SecurityUtils.getSubject(); if(subject.hasRole("admin")) { //有权限 } else { //无权限 } 注解式:通过在执行的Java方法上放置相应的注解完成

Shiro Review——权限管理基础知识

        只要是有用户参与的系统一般都会有权限管理,权限管理实现对用户的访问控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源.          权限管理包括用户认证和授权两部分. 一,用户认证      用户去访问系统,系统要验证用户身份的合法性.比较常见的认证方法:1,用户名密码方式:2,指纹识别,比如我们上班打卡:3,基于证书方式:     当系统验证了用户身份的合法性,用户方可访问系统的资源.      1, 用户认证流程           权限管理是基

Apache Shiro

Apache Shiro 是功能强大并且容易集成的开源权限框架,它能够完成认证.授权.加密.会话管理等功能.认证和授权为权限控制的核心,简单来说,"认证"就是证明你是谁? Web 应用程序一般做法通过表单提交用户名及密码达到认证目的."授权"即是否允许已认证用户访问受保护资源.关于 Shiro 的一系列特征及优点,很多文章已有列举,这里不再逐一赘述,本文重点介绍 Shiro 在 Web Application 中如何实现验证码认证以及如何实现单点登录. 14 评论

shiro初步 shiro认证

什么是shiro shiro是apache的一个开源框架,是一个权限管理的框架,实现 用户认证.用户授权. spring中有spring security (原名Acegi),是一个权限框架,它和spring依赖过于紧密,没有shiro使用简单. shiro不依赖于spring,shiro不仅可以实现 web应用的权限管理,还可以实现c/s系统,分布式系统权限管理,shiro属于轻量框架,越来越多企业项目开始使用shiro. 使用shiro实现系统 的权限管理,有效提高开发效率,从而降低开发成本

Apache Shiro 使用手册(二) Shiro 认证_Linux

一.Shiro认证过程 1.收集实体/凭据信息 复制代码 代码如下: //Example using most common scenario of username/password pair:UsernamePasswordToken token = new UsernamePasswordToken(username, password);//"Remember Me" built-in:token.setRememberMe(true); UsernamePasswordTok