【Shiro】03 ini认证实现
【基本概念】
1、身份验证
即在应用中谁能证明他就是他本人。
一般提供如他们的身份ID 一些标识信息来表明他就是他本人,如提供身份证,用户名/密码来证明。
在 shiro 中,用户需要提供principals (身份)和credentials(证明)给shiro,从而应用能验证用户身份:
2、身份 principals 【/'prɪnsəpl】
身份,即主体的标识属性,可以是任何东西,如用户名、邮箱等,唯一即可。
一个主体可以有多个principals,但只有一个Primary principals,一般是用户名/密码/手机号。
3、凭证 credentials 【/krə'dɛnʃlz/】
证明/凭证,即只有主体知道的安全值,如密码/数字证书等。
最常见的principals和credentials组合就是用户名/密码了。
【认证流程】
新建一个Maven工程,如果后续功能很多,我们可以删除主工程的SRC目录
再新建一个一个模块来开发学习。
需要的依赖包的坐标:
<dependencies> <!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-core --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.5.3</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.21</version> <scope>test</scope> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>1.7.21</version> <scope>test</scope> </dependency> </dependencies>
日志配置文件:
log4j.properties
# Global logging configuration log4j.rootLogger=DEBUG, stdout # MyBatis logging configuration... log4j.logger.org.mybatis.example.BlogMapper=TRACE # Console output... log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
认证信息配置:
shiro.ini
#配置用户 [users]admin=123456user=123456
存放位置:
编写测试类:
代码中的用户信息即表示我们的目标主体的信息
我们使用信息生成令牌进行登陆,对安全管理器加载好的ini认证信息进行核对
import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.AuthenticationToken; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.mgt.DefaultSecurityManager; import org.apache.shiro.realm.text.IniRealm; import org.apache.shiro.subject.Subject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @author DaiZhiZhou * @file Shiro * @create 2020-08-01 16:47 */ public class AuthenticationTest { // 日志输出工具 private static final transient Logger log = LoggerFactory.getLogger(AuthenticationTest.class); @SuppressWarnings("deprecation") public static void main(String[] args) { String username = "admin"; String password = "123456"; log.info("My First Apache Shiro Application"); // 新版已经摈弃了工厂模式创建对象,直接使用DefaultSecurityManager创建实例 DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager(); // 认证配置信息单独由IniRealm创建加载 IniRealm iniRealm = new IniRealm("classpath:shiro.ini"); // 在安全管理器中注册认证 defaultSecurityManager.setRealm(iniRealm); // 在安全工具类中设置安全管理器 SecurityUtils.setSecurityManager(defaultSecurityManager); // 得到目标主体 Subject subject = SecurityUtils.getSubject(); // 创建令牌实例 AuthenticationToken userToken = new UsernamePasswordToken(username, password); try { // 主体携带令牌登陆 subject.login(userToken); } catch (Exception exception) { exception.printStackTrace(); } Subject subject2 = SecurityUtils.getSubject(); aaaa(); System.out.println(subject == subject2); } public static void quickStart(){ // 1,创建安全管理器的工厂对象 org.apache.shiro.mgt.SecurityManager; 不能使用java.lang.SecurityManager //Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini"); // 2,使用工厂创建安全管理器 //SecurityManager securityManager = factory.getInstance(); // 3,把当前的安全管理器绑定当到线的线程 //SecurityUtils.setSecurityManager(securityManager); // 4,使用SecurityUtils.getSubject得到主体对象 //Subject subject = SecurityUtils.getSubject(); // 5,封装用户名和密码 //AuthenticationToken token = new UsernamePasswordToken(username, password); // 6,得到认证 //try { // subject.login(token); // System.out.println("认证通过"); //} catch (AuthenticationException e) { // System.out.println("用户名或密码不正确"); //} /*} catch (IncorrectCredentialsException e) { System.out.println("密码不正确"); } catch (UnknownAccountException e) { System.out.println("用户名不存在"); }*/ //Subject subject2 = SecurityUtils.getSubject(); //System.out.println(subject); //System.out.println(subject2); //aaaa(); } public static void aaaa() { Subject subject2 = SecurityUtils.getSubject(); System.out.println(subject2); } }