前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >shiro教程1(HelloWorld)

shiro教程1(HelloWorld)

作者头像
Java帮帮
发布2019-12-13 12:32:05
3430
发布2019-12-13 12:32:05
举报

hiro简介

shiro官网

Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。

框架图说明

官网架构说明

从外部查看shiro框架

应用代码直接交互的对象是Subject,也就是说Shiro的对外API核心就是Subject

内部结构框架

常见单词说明

Shiro中的shiro.ini说明

shiro.ini放置在classpath路径下shiro会自动查找。 ini配置文件中有四大主要配置类 main users roles urls

main

提供了对根对象securityManager及其依赖对象的配置

代码语言:javascript
复制
#创建对象
securityManager=org.apache.shiro.mgt.DefaultSecurityManager

其构造器必须是public空参构造器,通过反射创建相应的实例。

  1. 对象名=全限定类名 相对于调用public无参构造器创建对象
  2. 对象名.属性名=值 相当于调用setter方法设置常量值
  3. 对象名.属性名=$对象引用 相当于调用setter方法设置对象引用

users

提供了对用户/密码及其角色的配置,用户名=密码,角色1,角色2 username=password,role1,role2 例如:配置用户名/密码及其角色,格式:“用户名=密码,角色1,角色2”,角色部分可省略。如:

代码语言:javascript
复制
[users]
zhang=123,role1,role2
wang=123

roles

提供了角色及权限之间关系的配置,角色=权限1,权限2 role1 = permission1 , permission2 例如:配置角色及权限之间的关系,格式:“角色=权限1,权限2”;如:

代码语言:javascript
复制
[roles]
role1=user:create,user:update
role2=*

如果只有角色没有对应的权限,可以不配roles

urls

用于web,提供了对web url拦截相关的配置,url=拦截器[参数],拦截器

代码语言:javascript
复制
/index.html = anon
/admin/** = authc, roles[admin],perms["permission1"]

第一个案例

官方教程

添加对应的依赖

代码语言:javascript
复制
<dependency>
	<groupId>org.apache.shiro</groupId>
	<artifactId>shiro-core</artifactId>
	<version>1.1.0</version>
</dependency>
<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>slf4j-simple</artifactId>
	<version>1.6.1</version>
	<scope>test</scope>
</dependency>

<dependency>
	<groupId>junit</groupId>
	<artifactId>junit</artifactId>
	<version>4.12</version>
	<scope>test</scope>
</dependency>
<dependency>
	<groupId>commons-logging</groupId>
	<artifactId>commons-logging</artifactId>
	<version>1.2</version>
</dependency>

添加shiro.ini文件

src/main/resource下添加

添加内容如下

代码语言:javascript
复制
[users]
root = 123456
# 账号为root 密码是 123456

认证操作

代码语言:javascript
复制
@Test
public void test() {
	// 1.获取SecurityManager工厂对象
	Factory<SecurityManager> factory =
			new IniSecurityManagerFactory("classpath:shiro.ini");
	// 2.通过Factory对象获取SecurityManager对象
	SecurityManager securityManager = factory.getInstance();
	// 3.将SecurityManager对象添加到当前运行环境中
	SecurityUtils.setSecurityManager(securityManager);
	
	// 4.获取Subject对象
	Subject subject = SecurityUtils.getSubject();
	AuthenticationToken token = new UsernamePasswordToken("root", "123456");
	// 登录操作
	subject.login(token);
	// 获取登录的状态
	System.out.println(subject.isAuthenticated());
}

测试

账号密码正确
账号错误

账号错误抛 UnknownAccountException异常

密码错误

密码错误会抛 IncorrectCredentialsException异常

所以代码可以调整下:

代码语言:javascript
复制
	@Test
	public void test() {
		// 1.获取SecurityManager工厂对象
		Factory<SecurityManager> factory =
				new IniSecurityManagerFactory("classpath:shiro.ini");
		// 2.通过Factory对象获取SecurityManager对象
		SecurityManager securityManager = factory.getInstance();
		// 3.将SecurityManager对象添加到当前运行环境中
		SecurityUtils.setSecurityManager(securityManager);
		
		// 4.获取Subject对象
		Subject subject = SecurityUtils.getSubject();
		AuthenticationToken token = new UsernamePasswordToken("root", "111");
		// 登录操作
		try {
			subject.login(token);
		} catch (UnknownAccountException e) {
			System.out.println("账号出错...");
		} catch(IncorrectCredentialsException e){
			System.out.println("密码出错...");
		}
		// 获取登录的状态
		System.out.println(subject.isAuthenticated());
	}

认证流程总结

login方法
DelegatingSubject中的login方法

在此方法中我们看到是 SecurityManager来管理认证操作的 继续进入

进入DefaultSecurityManager的login方法

此方法中调用Authenticator认证

AbstractAuthenticator认证
ModularRealmAuthenticator

在该方法中获取ini文件中的信息,加载解析不是在次方法中。

AuthenticatingRealm

流程描述

  1. 创建token令牌,token中有用户提交的认证信息即账号和密码
  2. 执行subject.login(token),最终由securityManager通过Authenticator进行认证
  3. Authenticator的实现ModularRealmAuthenticator调用realm从ini配置文件取用户真实的账号和密码,这里使用的是IniRealm(shiro自带)
  4. IniRealm先根据token中的账号去ini中找该账号,如果找不到则给ModularRealmAuthenticator返回null,如果找到则匹配密码,匹配密码成功则认证通过。
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-12-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java帮帮 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 框架图说明
    • 从外部查看shiro框架
      • 内部结构框架
        • 常见单词说明
        • Shiro中的shiro.ini说明
          • main
            • users
              • roles
                • urls
                • 第一个案例
                  • 添加对应的依赖
                    • 添加shiro.ini文件
                      • 认证操作
                        • 测试
                          • 账号密码正确
                          • 账号错误
                          • 密码错误
                        • 认证流程总结
                          • login方法
                          • DelegatingSubject中的login方法
                          • 进入DefaultSecurityManager的login方法
                          • AbstractAuthenticator认证
                          • ModularRealmAuthenticator
                          • AuthenticatingRealm
                      • 流程描述
                      相关产品与服务
                      访问管理
                      访问管理(Cloud Access Management,CAM)可以帮助您安全、便捷地管理对腾讯云服务和资源的访问。您可以使用CAM创建子用户、用户组和角色,并通过策略控制其访问范围。CAM支持用户和角色SSO能力,您可以根据具体管理场景针对性设置企业内用户和腾讯云的互通能力。
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档