【Shiro】第三章 Shiro入门(一)

简介: 【Shiro】第三章 Shiro入门

1、身份认证

【1】基本流程

流程如下:

1、Shiro把用户的数据封装成标识token,token一般封装着用户名,密码等信息

2、使用Subject门面获取到封装着用户的数据的标识token

3、Subject把标识token交给SecurityManager,在SecurityManager安全中心中,SecurityManager把标识token委托给认证器Authenticator进行身份验证。认证器的作用一般是用来指定如何验证,它规定本次认证用到哪些Realm

4、认证器Authenticator将传入的标识token,与数据源Realm对比,验证token是否合法

【2】案例演示

【2.1】需求

1、使用shiro完成一个用户的登录

【2.2】实现

【2.2.1】新建项目

shiro-day01-01authenticator

【2.2.2】导入依赖

1. <?xml version="1.0" encoding="UTF-8"?>
2. 
3. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5. <modelVersion>4.0.0</modelVersion>
6. 
7. <groupId>com.itheima.shiro</groupId>
8. <artifactId>shiro-day01-01authenticator</artifactId>
9. <version>1.0-SNAPSHOT</version>
10. 
11. <name>shiro-day01-01authenticator</name>
12. <!-- FIXME change it to the project's website -->
13. <url>http://www.example.com</url>
14. 
15. <properties>
16. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
17. </properties>
18. 
19. <dependencies>
20. 
21. <dependency>
22. <groupId>commons-logging</groupId>
23. <artifactId>commons-logging</artifactId>
24. <version>1.1.3</version>
25. </dependency>
26. 
27. <dependency>
28. <groupId>org.apache.shiro</groupId>
29. <artifactId>shiro-core</artifactId>
30. <version>1.3.2</version>
31. </dependency>
32. 
33. <dependency>
34. <groupId>junit</groupId>
35. <artifactId>junit</artifactId>
36. <version>4.11</version>
37. </dependency>
38. 
39. </dependencies>
40. 
41. <build>
42. <plugins>
43. <!-- compiler插件, 设定JDK版本 -->
44. <plugin>
45. <groupId>org.apache.maven.plugins</groupId>
46. <artifactId>maven-compiler-plugin</artifactId>
47. <version>3.1</version>
48. <configuration>
49. <source>8</source>
50. <target>8</target>
51. <showWarnings>true</showWarnings>
52. </configuration>
53. </plugin>
54. </plugins>
55. </build>
56. </project>

【2.2.3】编写shiro.ini

1. #声明用户账号
2. [users]
3. jay=123

【2.2.4】编写HelloShiro

1. package com.itheima.shiro;
2. 
3. import org.apache.shiro.SecurityUtils;
4. import org.apache.shiro.authc.UsernamePasswordToken;
5. import org.apache.shiro.config.IniSecurityManagerFactory;
6. import org.apache.shiro.mgt.SecurityManager;
7. import org.apache.shiro.subject.Subject;
8. import org.apache.shiro.util.Factory;
9. import org.junit.Test;
10. 
11. /**
12.  * @Description:shiro的第一个例子
13.  */
14. public class HelloShiro {
15. 
16. @Test
17. public void shiroLogin() {
18. //导入权限ini文件构建权限工厂
19.         Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
20. //工厂构建安全管理器
21. SecurityManager securityManager = factory.getInstance();
22. //使用SecurityUtils工具生效安全管理器
23.         SecurityUtils.setSecurityManager(securityManager);
24. //使用SecurityUtils工具获得主体
25. Subject subject = SecurityUtils.getSubject();
26. //构建账号token
27. UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("jay", "123");
28. //登录操作
29.         subject.login(usernamePasswordToken);
30.         System.out.println("是否登录成功:" + subject.isAuthenticated());
31.     }
32. }

【2.2.4】测试

【2.3】小结

1、权限定义:ini文件

2、加载过程:

   导入权限ini文件构建权限工厂

   工厂构建安全管理器

   使用SecurityUtils工具生效安全管理器

   使用SecurityUtils工具获得主体

   使构建账号token用SecurityUtils工具获得主体

   构建账号token

   登录操作

2、Realm

【1】Realm接口

所以,一般在真实的项目中,我们不会直接实现Realm接口,我们一般的情况就是直接继承AuthorizingRealm,能够继承到认证与授权功能。它需要强制重写两个方法

1. public class DefinitionRealm extends AuthorizingRealm {
2. 
3. /**
4.   * @Description 认证
5.   * @param authcToken token对象
6.   * @return 
7.   */
8.  public abstract AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) {
9. return null;
10.     }
11. 
12.   /**
13.    * @Description 鉴权
14.    * @param principals 令牌
15.    * @return
16.    */
17.   public abstract AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals){
18. return null;
19.     }
20. }

【2】自定义Realm

【2.1】需求

1、自定义Realm,取得密码用于比较

【2.2】实现

【2.2.1】创建项目

shiro-day01-02realm

【2.2.2】定义SecurityService

SecurityService

1. package com.itheima.shiro.service;
2. 
3. /**
4.  * @Description:权限服务接口
5.  */
6. public interface SecurityService {
7. 
8. /**
9.      * @Description 查找密码按用户登录名
10.      * @param loginName 登录名称
11.      * @return
12.      */
13.     String findPasswordByLoginName(String loginName);
14. }

SecurityServiceImpl

1. package com.itheima.shiro.service.impl;
2. 
3. import com.itheima.shiro.service.SecurityService;
4. 
5. /**
6.  * @Description:权限服务层
7.  */
8. public class SecurityServiceImpl implements SecurityService {
9. 
10. @Override
11. public String findPasswordByLoginName(String loginName) {
12. return "123";
13.     }
14. }


相关文章
|
存储 算法 程序员
【Shiro】第三章 Shiro入门(二)
【Shiro】第三章 Shiro入门(二)
86 1
|
存储 算法 数据安全/隐私保护
【Shiro】第三章 Shiro入门(三)
【Shiro】第三章 Shiro入门(三)
82 1
|
缓存 数据库 数据安全/隐私保护
【Shiro】第三章 Shiro入门(四)
【Shiro】第三章 Shiro入门(四)
88 0
|
存储 缓存 安全
【Shiro】第二章 Shiro概述
【Shiro】第二章 Shiro概述
94 0
|
存储 缓存 安全
Shiro学习之Shiro简介
Shiro学习之Shiro简介
119 0
|
Java API 数据库
Shiro学习之Shiro基本使用(1)
Shiro学习之Shiro基本使用(1)
96 0
|
Java 数据库 数据安全/隐私保护
Shiro学习之Shiro基本使用(2)
Shiro学习之Shiro基本使用(2)
63 0
|
Java 网络安全 数据库
shiro实战教程(二)
shiro实战教程(二)
242 1
shiro实战教程(二)
|
存储 数据采集 缓存
Shiro简介
.什么是Shiro - .ApacheShiro 是一个Java的安全(权限)框架。 - .Shiro可以非常容易的开发出足够好的应用,其不仅可以用在JavaSE环境,也可以用在JavaEE环境。 - .Shiro可以完成,认证,授权,加密,会话管理,Web集成,缓存等。
Shiro简介
|
SQL 缓存 NoSQL
shiro实战教程(三)
shiro实战教程(三)
132 0
shiro实战教程(三)
下一篇
DataWorks