Shiro依赖于SLFJ日志框架,而SLFJ只是一个接口,并没用提供具体的实现,可以选择Log4J作为它的实现,正好SLFJ也提供了一个slf4j-log4j12的Artifact,所以这里就可以用上了。
既然使用了Log4J,那么就应该在classpath下提供一个log4j.properties文件:
log4j.rootLogger=INFO,console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%-5p %c(%L) - %m%n
通过上面的配置将日志输出到控制台上,并配置了日志输出格式。
同样,既然使用了Shiro,那么就应该在classpath下提供一个shiro.ini文件:
[users]
shiro = 201314
我们配置了一个用户名为shiro,密码为201314(爱你一生一世)的用户。当然,这里仅仅为了演示,在实际项目中肯定不会把用户信息定义在配置文件中,除非这个项目的用户只有用户自己。
我们就用这个用户来见识一下Shiro的认证服务功能,下面写一个main方法试试:
package com.pifeng.shiro;
import org.apache.log4j.Logger;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
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.apache.shiro.util.Factory;
/**
* 1.需要读取classpath下的shiro.ini配置文件,并通过工厂类创建SecurityManager对象,最终将其对象放入SecurityUtils中,供shiro框架随时获取。
* 2.同样通过SecurityUtils类获取Subject对象,其实就是当前用户,只不过在shiro的世界里优雅地将其称为Subject(主体)。
* 3.首先使用一个Username与Password来创建一个UsernamePasswordToken对象,然后通过这个Token对象调用Subject对象的login方法,让shiro进行用户身份认证。
* 4.当登陆失败时,可以使用AuthenticationException来捕获这个异常;当登陆成功时,可以调用Subject对象的getPrincipal方法来获取Username,此时shiro已经创建一个Session。
* 5.最后通过Subject对象的logout方法来注销本次Session。
*/
public class HelloShiro {
private static final Logger LOGGER=Logger.getLogger(HelloShiro.class);
public static void main(String[] args) {
//初始化SecurityManager
Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:shiro.ini");
SecurityManager securityManager=factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);
//获取当前用户
Subject subject=SecurityUtils.getSubject();
//登陆
UsernamePasswordToken token=new UsernamePasswordToken("shiro", "201314");
try {
subject.login(token);
} catch (AuthenticationException e) {
LOGGER.info("登陆失败!");
return;
}
LOGGER.info("登陆成功! Hello "+subject.getPrincipal());
//注销
subject.logout();
}
}
运行结果如下:
SLF4J: This version of SLF4J requires log4j version 1.2.12 or later. See also http://www.slf4j.org/codes.html#log4j_version
INFO org.apache.shiro.session.mgt.AbstractValidatingSessionManager(230) - Enabling session validation scheduler...
INFO com.pifeng.shiro.HelloShiro(38) - 登陆成功! Hello shiro
EnumerateProviders catalog=0
EnumerateProviders totalPro=21
不难发现,SecurityManager才是Shiro的真正核心!