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. }