Shiro 笔记

功能

  • 认证

  • 授权

  • 加密

  • session 管理

认证

Subject 是一个与系统交互的实体,可以是人,也可以是其他等

调用 SecurityUtils.getSubject()返回当前Subject,即当前用户

// 创建 Realm
IniRealm iniRealm = new IniRealm("classpath:shiro.ini");
// 将 Realm 给 SecurityManager
SecurityManager securityManager = new DefaultSecurityManager(iniRealm);
​
// 将 SecurityManager 赋值给 SecurityUtils
SecurityUtils.setSecurityManager(securityManager);
// 获取当前 Subject (当前用户)
Subject currentUser = SecurityUtils.getSubject();
​
// 判断是否认证
if (! currentUser.isAuthenticated()) {
    // 要进行登录的 Token
    UsernamePasswordToken token = new UsernamePasswordToken("name", "password");
    token.setRememberMe(true);
    try {
        // 登录-使用 Realm 校验要登录的 Token
        currentUser.login(token);
    } catch (UnknownAccountException uae) {
        log.error("Username Not Found!", uae);
    } catch (IncorrectCredentialsException ice) {
        log.error("Invalid Credentials!", ice);
    } catch (LockedAccountException lae) {
        log.error("Your Account is Locked!", lae);
    } catch (AuthenticationException ae) {
        log.error("Unexpected Error!", ae);
    }
}

Realm 配置文件

[users]
user = password, admin
user2 = password2, editor
​
[roles]
admin = *
editor = articles:*

授权

对用户赋予指定的角色,每个角色有特定的权限

// 判断用户是否有特定角色
if (currentUser.hasRole("admin")) {
    log.info("Welcome Admin");
} else if (currentUser.hasRole("editor")) {
    log.info("Welcomt Editor");
} else {
    log.info("Welcome Guest");
}
// 判断当前用户是否有特定权限
if (currentUser.isPermitted("articles:compose")) {
    log.info("You can compose an article");
} else {
    log.info("You are not permitted to compose an article!");
}

Realm 配置

Realm 是一个 DAO,用来保存用户认证和授权所需要的信息,它可以来自文件也可以来自数据库等

要创建一个 Realm,只需要实现 Realm 接口,框架中有已经实现的 JdbcRealm,可以继承它,覆写下面的方法

doGetAuthenticationInfo()doGetAuthorizationInfo()getRoleNamesForUser()getPermissions()

之后可以与之前IniRealm同样使用

登出

currentUser.logout();

Session 管理

如果在 Web 环境下,默认使用HttpSession实现,在独立桌面应用中也可使用

Session session = currentUser.getSession();
session.setAttribute("key", "value");
String value = (String) session.getAttribute("key");
if (val.equals("value")) {
    log.info("Retrieved the correct value! [" + vallue + "]");
}

集成到 SpringBoot

maven 依赖:

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-spring-boot-web-starter</artifactId>
    <version>1.4.0</version>
</dependency>

下面需要配置 Realm 与 Shiro security filters

@Bean
public Realm realm() {
    return new MyCustomRealm();
}
     
@Bean
public ShiroFilterChainDefinition shiroFilterChainDefinition() {
    DefaultShiroFilterChainDefinition filter
      = new DefaultShiroFilterChainDefinition();
 
    filter.addPathDefinition("/secure", "authc");
    filter.addPathDefinition("/**", "anon");
 
    return filter;
}

参考文献

原文地址:https://www.cnblogs.com/zawier/p/9236892.html