Shiro 登录验证 那点事儿

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

从官网上,我们基本上可以了解到,她提供的服务非常明确:

Authentication(认证)

Authorization(授权)

Session Management(会话管理)

Cryptography(加密)

首先,她提供了 Authentication(认证)服务,也就是说,通过她可以完成身份认证,让她去判断您是否为真实的会员。

其次,她还提供了 Authorization(授权)服务,其实说白了就是“访问控制”服务,也就是让她来识别您是否可以做某件事情,毕竟不同的会员是拥有不同的权限的。

更有特色的是,她还提供了 Session Management(会话管理)服务,这个就厉害了,这并不是您熟知的 HTTP Session,而是一个独立的 Session 管理框架,不管是否为 Web 应用,都可以用这套框架。

最后(但并不是最不重要的),她还提供了 Cryptography(加密)服务,封装了许多密码学算法,有您知道的,也有您不知道的,总之琳琅满目,应有尽有。

除了以上 4 个基本服务以外,她也提供很好的系统集成方案,您可以轻松将其运用到 Web 应用中,可能这也是您最关心的。此外,还可以集成第三方框架,例如:Spring、Guice、CAS 等。

想必您已经了解了 Shiro 的主要功能,那么如何才能真正占有她呢?不妨先主动跟她打声招呼吧:Hello Shiro!

Hello Shiro
如果您与我一样,也使用 Maven 的话,可以将以下配置复制到您的 pom.xml 文件中:

<groupId>org.slf4j</groupId>

<artifactId>slf4j-log4j12</artifactId>

<version>1.6.4</version>

<groupId>org.apache.shiro</groupId>

<artifactId>shiro-core</artifactId>

<version>1.2.3</version>


需要说明的是,Shiro 依赖于 SLFJ 日志框架,而 SLFJ 只是一个接口,并没有提供具体的实现,您可以选择 Log4J 作为它的实现,正好 SLFJ 也提供了一个 slf4j-log4j12 的 Artifact,所以这就用上了。

下面是 hello 项目的 Maven 依赖图:这里写图片描述

既然使用了 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,密码为“爱你一生一世”的用户。当然,这里仅为演示,在您的实际项目中肯定不会把用户信息定义在配置文件中,除非这个项目的用户只有您自己。

我们就用这个用户来见识一下 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 吧:

需要读取 classpath 下的 shiro.ini 配置文件,并通过工厂类创建 SecurityManager 对象,最终将其放入 SecurityUtils 中,供 Shiro 框架随时获取。

同样通过 SecurityUtils 类获取 Subject 对象,其实就是当前用户,只不过在 Shiro 的世界里优雅地将其称为 Subject(主体)。

首先使用一个 Username 与 Password,来创建一个 UsernamePasswordToken 对象,然后我们通过这个 Token 对象调用 Subject 对象的 login 方法,让 Shiro 进行用户身份认证。

当登录失败时,您可以使用 AuthenticationException 来捕获这个异常;当登录成功时,您可以调用 Subject 对象的 getPrincipal 方法来获取 Username,此时 Shiro 已经为您创建了一个 Session。

最后还是通过 Subject 对象的 logout 方法来注销本次 Session。

感觉还不错吧?您只需要知道以上几个 Shiro 的核心成员的基本用法,Shiro 就是您的了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值