安全控制框架---Shiro
Shiro是一款轻量级Java安全框架.
Apache Shiro 官网 : http://shiro.apache.org/
从官网上,我们基本可以了解到它提供的服务非常明确 :
(1) Authentication(认证)
(2) Authorization (授权)
(3) Session Management(会话管理)
(4) Cryptography(加密)
首先,她提供了Authentication(认证)服务,也就是说,通过她可以完成身份认证,让她判断用户是否为真实的会员.
其次,她还提供了Authorization(授权)服务,说白了就是"访问控制"服务,也就是让她来识别用户是否可以做某件事请,毕竟不同的用户是拥有不同的权限的.
更有特色的是,她还提供了Session Manager(会话管理)服务,这并不是用户熟知的HTTP Session,而是一个独立的Session管理框架,不管是否为Web应用,都可以用这套框架.
最后,她还提供了Cryphography(加密)服务,封装了许多密码学算法,琳琅满目,应有尽有.
除了以上4个基本服务,她页提供了很好的系统集成方案,用户可以轻松将其运用到Web应用中;此外,还可以继承第三方框架,例如: Spring, Guice, CAS等.
接下来介绍一下Shiro的基本用法 :
如果使用Maven的话,必须将以下依赖添加到pom.xml中
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.4</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.2.3</version>
</dependency>
因为Shiro依赖于SLFJ日志框架,而SLFJ只是一个接口,并没有提供具体的实现,所以我们可以选择Log4J作为它的实现.
既然使用了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方式试试 :
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; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class HelloShiro { private static final Logger LOGGER = LoggerFactory.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 ae) { LOGGER.info("登陆失败!"); return; } LOGGER.info("登陆成功!Hello " + subject.getPrincipal()); //注销 subject.logout(); } }
我们分析一下这个HelloShiro :
(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.
浙公网安备 33010602011771号