安全控制框架---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.

  

posted @ 2017-05-18 16:38  陈皮12311  阅读(118)  评论(0)    收藏  举报