前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >shiro原理 及 第一个认证shiro

shiro原理 及 第一个认证shiro

作者头像
用户5927264
发布2019-07-31 18:11:14
5590
发布2019-07-31 18:11:14
举报
文章被收录于专栏:OSChina

1 shiro的 原理 讲解

输入图片说明
输入图片说明
输入图片说明
输入图片说明
输入图片说明
输入图片说明
输入图片说明
输入图片说明

2 第一个入门程序

:

代码语言:javascript
复制
package com.shi.authentication;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.util.Factory;
import org.junit.Test;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
/**
 * 认证测试
 * @author SHF
 *
 */
public class AuthenticationTest {
	//用户登录和退出
	@Test
	public void testLoginAndLogout(){
		//1 创建securityManager工厂,通过ini配置文件创建securityManage工厂
		Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:shiro-first.ini");
		
		//2 创建SecurityManager
		SecurityManager securityManager=factory.getInstance();
		
		//3 将SecurityManager设置当前的运行环境中
		SecurityUtils.setSecurityManager(securityManager);
		
		//4 从SecurityUtils里边创建一个subject
		Subject subject=SecurityUtils.getSubject();
		
		//5 在认证提交前准备token(令牌)
		UsernamePasswordToken token =new UsernamePasswordToken("zhangsan", "111111");
		
		try {
			//6 执行认证提交
			subject.login(token);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		//是否认证通过
		boolean isAuthenticated=subject.isAuthenticated();
		System.out.println("是否认证通过:"+isAuthenticated);
		
		subject.logout();
		//是否认证通过
		boolean isAuthenticated2=subject.isAuthenticated();
		System.out.println("是否认证通过:"+isAuthenticated2);
		
	}
}
输入图片说明
输入图片说明
输入图片说明
输入图片说明

shiro-first.ini

代码语言:javascript
复制
#对用户信息进行设置
[users]
#设置用户名和密码
zhangsan=111111
lisi=222222

jar包:

代码语言:javascript
复制
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.shi.shiro</groupId>
  <artifactId>Shiro-First</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <dependencies>
  	<dependency>
  		<groupId>junit</groupId>
  		<artifactId>junit</artifactId>
  		<version>4.12</version>
  	</dependency>
  	<dependency>
  		<groupId>commons-beanutils</groupId>
  		<artifactId>commons-beanutils</artifactId>
  		<version>1.8.3</version>
  	</dependency>
  	<dependency>
  		<groupId>commons-logging</groupId>
  		<artifactId>commons-logging</artifactId>
  		<version>1.1.1</version>
  	</dependency>
  	<dependency>
	    <groupId>org.apache.shiro</groupId>
	    <artifactId>shiro-core</artifactId>
	    <version>1.2.3</version>
	</dependency>
  	<dependency>
  		<groupId>org.slf4j</groupId>
  		<artifactId>slf4j-log4j12</artifactId>
  		<version>1.7.7</version>
  	</dependency>
  	<dependency>
  		<groupId>log4j</groupId>
  		<artifactId>log4j</artifactId>
  		<version>1.2.12</version>
  	</dependency>
  </dependencies>
</project>

3 自定义realm 实现

代码语言:javascript
复制
package com.shi.realm;

import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;

public class CustomRealm extends AuthorizingRealm{

	//设置realm的名字
	@Override
	public void setName(String name) {
		super.setName("customRealm");
	}
	
	
	/**
	 * 用于认证
	 */
	@Override
	protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
		
		//1 从token中取出身份信息(token是用户输入的)
		String userCode=(String) token.getPrincipal();
		
		//2 根据用户输入的userCode从数据库查询
		//...  模拟数据库中取出的密码是"111111"
		String password="111111";
		
		//3 如果 查询不到返回null
		if(!"zhangsan".equals(userCode)){
			return null;
		}
		
		
		//如果查询到 返回认证信息AuthenticationInfo
		SimpleAuthenticationInfo simpleAuthenticationInfo=new SimpleAuthenticationInfo(userCode, password, this.getName());
		
		return simpleAuthenticationInfo;
	}
	
	/**
	 * 用于授权
	 */
	@Override
	protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
		// TODO Auto-generated method stub
		return null;
	}

}

shiro-realm.ini文件 的配置

代码语言:javascript
复制
[main]
#自定义realm
customRealm=com.shi.realm.CustomRealm
#讲realm设置到securityManager中,相当于spring中的注入
securityManager.realm=$customRealm

测试代码:

代码语言:javascript
复制
// 2  自定义CustomRealm测试 
	@Test
	public void testCustomRealm(){
		//1 创建securityManager工厂,通过ini配置文件创建securityManage工厂
		Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:shiro-realm.ini");
		
		//2 创建SecurityManager
		SecurityManager securityManager=factory.getInstance();
		
		//3 将SecurityManager设置当前的运行环境中
		SecurityUtils.setSecurityManager(securityManager);
		
		//4 从SecurityUtils里边创建一个subject
		Subject subject=SecurityUtils.getSubject();
		
		//5 在认证提交前准备token(令牌)
		UsernamePasswordToken token =new UsernamePasswordToken("zhangsan", "111111");
		
		try {
			//6 执行认证提交
			subject.login(token);
		} catch (Exception e) {
			e.printStackTrace();
		}
		//是否认证通过
		boolean isAuthenticated=subject.isAuthenticated();
		System.out.println("是否认证通过:"+isAuthenticated);
		
		subject.logout();
		//是否认证通过
		boolean isAuthenticated2=subject.isAuthenticated();
		System.out.println("是否认证通过:"+isAuthenticated2);
	}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2 第一个入门程序
  • 3 自定义realm 实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档