***SHRIO Hello World***
编码获得Subject认证主体,获得用户的Token令牌,认证主体验证Token令牌。
<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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.company.shiro</groupId> <artifactId>ShiroLesson</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <name>ShiroLesson Maven Webapp</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-core --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.3.2</version> </dependency> <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.25</version> <scope>compile</scope> </dependency> </dependencies> <build> <finalName>ShiroLesson</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build> </project> |
#log4j的信息显示是信息INFO级别,stdout为输出端 log4j.rootLogger=INFO, stdout #stdout输出端设定为控制台输出,设定信息输出的格式要求 log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m %n #apache的信息显示是警告级别 log4j.logger.org.apache=WARN #spring框架的信息显示是警告级别 log4j.logger.org.springframework=WARN #shrio的信息显示是具体执行步骤 log4j.logger.org.apache.shiro=TRACE #shrio线程及缓存等其他性能信息显示是警告级别 log4j.logger.org.apache.shiro.util.ThreadContext=WARN log4j.logger.org.apache.shiro.cache.ehcache.EhCache=WARN |
[users] # 用户名=密码 scott=tiger root=root user=123456 |
package com.company.shiro; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.AuthenticationToken; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.config.IniSecurityManagerFactory; import org.apache.shiro.mgt.SecurityManager; import org.apache.shiro.subject.Subject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class ShiroFirst { public static final Logger log = LoggerFactory.getLogger(ShiroFirst.class);//获取Logger日志对象 public static void main(String[] args) { //1-创建SecurityManager安全管理器对象,读取shiro配置文件信息 SecurityManager securityManager = new IniSecurityManagerFactory("classpath:shiro.ini").getInstance(); SecurityUtils.setSecurityManager(securityManager);//2-配置安全管理工具SecurityUtil Subject authenSubject = SecurityUtils.getSubject();//3-获得Subject对象 //4-获取Token令牌 AuthenticationToken successToken = new UsernamePasswordToken("scott", "tiger");//成功 AuthenticationToken errorToken = new UsernamePasswordToken("scott", "sdjfls");//失败 try { //5-Subject对象验证Token令牌,成功继续执行,失败抛出异常 // authenSubject.login(successToken); authenSubject.login(errorToken); log.info("login success!"); } catch (Exception e) { e.printStackTrace(); log.error("login error!"); } //6-注销登录信息 authenSubject.logout(); } } |
扩展内容:
一 了解什么是Token令牌:
Token机制相对于Cookie机制又有什么优势?
- 支持跨域访问: Cookie是不允许垮域访问的,这一点对Token机制是不存在的,前提是传输的用户认证信息通过HTTP头传输.
- 无状态(也称:服务端可扩展行):Token机制在服务端不需要存储session信息,因为Token 自身包含了所有登录用户的信息,只需要在客户端的cookie或本地介质存储状态信息.
- 更适用CDN: 可以通过内容分发网络请求你服务端的所有资料(如:javascript,HTML,图片等),而你的服务端只要提供API即可.
- 去耦: 不需要绑定到一个特定的身份验证方案。Token可以在任何地方生成,只要在你的API被调用的时候,你可以进行Token生成调用即可.
- 更适用于移动应用: 当你的客户端是一个原生平台(iOS, Android,Windows 8等)时,Cookie是不被支持的(你需要通过Cookie容器进行处理),这时采用Token认证机制就会简单得多。
- CSRF:因为不再依赖于Cookie,所以你就不需要考虑对CSRF(跨站请求伪造)的防范。
- 性能: 一次网络往返时间(通过数据库查询session信息)比计算 Token验证和解析要费时得多.
- 不需要为登录页面做特殊处理: 做功能测试的时候,不再需要为登录页面做特殊处理.
- 基于标准化:你的API可以采用标准化的 JSON Web Token (JWT). 这个标准已经存在多个后端库(.NET, Ruby, Java,Python, PHP)和多家公司的支持(如:Google, Microsoft).
二 使用slf4j调用日志功能(slf4j相当于接口,log4j相当于实现)