Shiro-快速上手

ragnar 1年前 ⋅ 177 阅读

Shiro是一个Java安全框架,用于身份认证、授权和会话管理等安全特性。它为开发人员提供了一套简单易用的API,可以集成到Java应用程序中,以实现对用户身份认证、权限控制和会话管理的支持。Shiro提供了一系列的组件和工具,可以帮助开发人员构建安全的应用程序,并处理常见的安全问题。
本文根据shiro官网的指南,示例快速上手

官网指南:https://shiro.apache.org/tutorial.html

1 引入依赖

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-core</artifactId>
    <version>1.12.0</version>
</dependency>

2 配置shiro

2.1 配置文件方式

配置文件 shiro.ini

[users]
root = secret, admin
guest = guest, guest
presidentskroob = 12345, president
darkhelmet = ludicrousspeed, darklord, schwartz
lonestarr = vespa, goodguy, schwartz

[roles]
admin = *
schwartz = lightsaber:*
goodguy = winnebago:drive:eagle5

demo:

// 给工厂指定配置文件
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");

// 工厂根据配置文件创建对应的Shiro的安全管理类对象
SecurityManager securityManager = factory.getInstance();

// 把对象保存到工具类中,以便后续调用
SecurityUtils.setSecurityManager(securityManager);

3 使用shiro

3.1 获取当前用户-Subject

要管理好应用的安全问题,就必须的要确认“当前用户是谁?”或者“当前用户是否可以进行当前操作?”。 所以我们应用的安全是基于“当前用户”的。
获取当前用户--Subject对象

Subject currentUser = SecurityUtils.getSubject();

Subject对象是保存在 ThreadLocal 的,这里的 SecurityUtils.getSubject() 是把 Subject 对象从当前线程的 ThreadLocal 中取出来。

3.2 会话信息-Session

Session session = currentUser.getSession();
session.setAttribute( "someKey", "aValue" );    

这个 Session 是一个特定于Shiro的实例,提供了大多数您在常规 HttpSessions 中使用的功能,但还有一些额外的好处和一个重要的区别:它不需要HTTP环境!

3.3 登录-保存用户的信息

if ( !currentUser.isAuthenticated() ) {
    //collect user principals and credentials in a gui specific manner
    //such as username/password html form, X509 certificate, OpenID, etc.
    //We'll use the username/password example here since it is the most common.
    UsernamePasswordToken token = new UsernamePasswordToken("lonestarr", "vespa");

    //this is all you have to do to support 'remember me' (no config - built in!):
    token.setRememberMe(true);

    currentUser.login(token);
}

3.4 查看用户的信息

获取名称

String userName = currentUser.getPrincipal();

判断是否有指定角色

boolean flag = currentUser.hasRole( "schwartz" );

判断是否有指定权限

boolean flag = currentUser.isPermitted( "lightsaber:wield" );

3.5 退出登录

//removes all identifying information and invalidates their session too.
currentUser.logout();

全部评论: 0

    我有话说:

    目录