shiro实现
Shiro 是一个 Java 安全框架,可以用来实现身份验证、授权、加密等安全相关的功能。它提供了一套简单易用的 API,可以与任意 Java 应用程序集成。下面介绍如何使用 Shiro 实现身份验证和授权。
- 添加 Shiro 依赖
在 Maven 项目中,可以通过添加以下依赖来引入 Shiro:
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.7.1</version>
</dependency>
- 编写 Shiro 配置文件
Shiro 配置文件可以用来配置安全相关的组件,如 Realm、Session 管理器、加密算法等。可以通过以下方式创建一个 shiro.ini 配置文件:
[main]
# 定义 Realm
myRealm = com.example.MyRealm
# 定义 Session 管理器
mySessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager
# 定义 Cookie
myCookie = org.apache.shiro.web.servlet.SimpleCookie
myCookie.name = myCookieName
myCookie.httpOnly = true
myCookie.maxAge = 86400
# 定义加密算法
myHash = org.apache.shiro.crypto.hash.SimpleHash
myHash.algorithmName = SHA-256
myHash.iterations = 1000
# 配置 Realm
securityManager.realm = $myRealm
# 配置 Session 管理器
securityManager.sessionManager = $mySessionManager
sessionManager.sessionDAO = org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO
sessionManager.sessionIdCookie = $myCookie
sessionManager.sessionIdCookieEnabled = true
sessionManager.globalSessionTimeout = 1800000
# 配置加密算法
passwordService.hashAlgorithmName = $myHash.algorithmName
passwordService.hashIterations = $myHash.iterations
- 实现 Realm
Realm 是 Shiro 中最重要的组件之一,它负责从数据源中获取用户信息和权限信息,并将这些信息提供给 Shiro 进行身份验证和授权。可以通过继承 org.apache.shiro.realm.Realm 接口来实现自己的 Realm。
下面是一个简单的 Realm 实现,它从一个 Map 中获取用户信息和权限信息:
public class MyRealm implements Realm {
private Map<String, String> users = new HashMap<>();
private Map<String, Set<String>> permissions = new HashMap<>();
public MyRealm() {
users.put("admin", "admin");
permissions.put("admin", new HashSet<>(Arrays.asList("user:list", "user:add", "user:delete")));
}
@Override
public String getName() {
return "myRealm";
}
@Override
public boolean supports(AuthenticationToken token) {
return token instanceof UsernamePasswordToken;
}
@Override
public AuthenticationInfo getAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
String username = (String) token.getPrincipal();
String password = new String((char[]) token.getCredentials());
if (!users.containsKey(username) || !users.get(username).equals(password)) {
throw new IncorrectCredentialsException();
}
return new SimpleAuthenticationInfo(username, password, getName());
}
@Override
public AuthorizationInfo getAuthorizationInfo(PrincipalCollection principals) {
String username = (String) principals.getPrimaryPrincipal();
SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
authorizationInfo.addRoles(Collections.singleton("admin"));
authorizationInfo.addStringPermissions(permissions.get(username));
return authorizationInfo;
}
}
- 使用 Shiro 进行身份验证和授权
要使用 Shiro 进行身份验证和授权,可以通过以下方式:
// 创建 SecurityManager
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
SecurityManager securityManager = factory.getInstance();
// 绑定 SecurityManager 到当前线程
SecurityUtils.setSecurityManager(securityManager);
// 获取 Subject
Subject subject = SecurityUtils.getSubject();
// 调用登录方法进行身份验证
UsernamePasswordToken token = new UsernamePasswordToken("admin", "admin");
subject.login(token);
// 调用授权方法进行授权
assertTrue(subject.hasRole("admin"));
assertTrue(subject.isPermitted("user:list"));
原文地址: https://www.cveoy.top/t/topic/ucR 著作权归作者所有。请勿转载和采集!