Shiro教程--Hello Wolrd(一)

官网:http://shiro.apache.org/

***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相当于实现)

log4j.properties

猜你喜欢

转载自blog.csdn.net/weixin_38964895/article/details/81099047
今日推荐