Apache Shiro

Apache Shiro 入门指南

简介

Apache Shiro:Java 安全框架

功能:

  • 认证 Authentication
  • 授权 Authorization
  • 加密 Crytography
  • 会话管理 Session Management

概念:

  • Subject
  • Security Manager
  • Realm (Shiro DAO)

API

权限配置 shiro.ini

# 用户和角色(角色可选)
# username = pasword, role1, role2, ..., roleN
[users]
root = secret, admin
guest = guest, guest

# 角色和权限
# role = perm1, perm2, ..., permN
[roles]
# admin 拥有所有权限
admin = *
# author 拥有博客下的所有权限
author = blog:*
# action:type:instace id
goodguy = winnebago:drive:eagle5

创建 SecurityManager:

Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
SecurityManager securityManager = factory.getInstance();

SecurityUtils.setSecurityManager(securityManager);

获取当前用户(未登录匿名用户):

Subject user = SecurityUtils.getSubject();

获取用户会话:

Session session = user.getSession();
session.setAttribute("key", "value");

用户登录:

if (!user.isAuthenticated()) {
    UsernamePasswordToken token = new UsernamePasswordToken("username", "password");
    token.setRemenberMe(true);
    user.login(token);
}

捕获登录异常:

try {
    user.login(token);
} catch(UnknownAccountException e) {
    // 用户名不存在
} catch(IncorrectCredentialsException e) {
    // 密码错误
} catch(LockedAccountException e) {
    // 用户被锁定
} catch (AuthticationException e) {
    // 其他异常
}

安全最佳实践:登录失败是,不要给用户返回过于详细的信息(比如,账号不存在、密码错误),避免被黑客恶意利用

获取用户名:

user.getPrincipal();

检查用户角色:

if (user.hasRole("admin")) {}

检查用户权限:

if (user.isPermitted("file:write")) {}

用户登出并清除会话:

user.logout();

参阅

posted @ 2022-10-14 22:29  廖子博  阅读(41)  评论(0编辑  收藏  举报