Shiro是一个开源的安全框架,主要用于权限管理和身份验证。它提供了一种简单而强大的方式来保护应用程序,确保只有授权的用户才能访问特定的资源。本文将带你轻松入门Shiro权限配置,通过实操解析,让你快速掌握企业级安全控制。
Shiro的核心概念
在开始配置之前,了解Shiro的核心概念是至关重要的。Shiro的主要组件包括:
- Subject:代表当前用户。
- SecurityManager:安全管理器,管理内部组件。
- Realm:域,负责验证用户身份和权限。
- Session:会话,存储用户状态信息。
- Authorization:授权,控制用户对资源的访问。
安装与配置
首先,确保你的项目中已经包含了Shiro依赖。以下是Maven依赖的例子:
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.9.1</version>
</dependency>
接下来,配置Shiro的SecurityManager:
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.apache.shiro.mgt.SecurityManager;
public class ShiroConfig {
public SecurityManager securityManager() {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
// 设置Realm
securityManager.setRealm(userRealm());
return securityManager;
}
// 其他配置...
}
Realm配置
Realm是Shiro进行身份验证和授权的核心。以下是一个简单的Realm配置示例:
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
public class UserRealm extends AuthorizingRealm {
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
// 获取用户名
String username = (String) token.getPrincipal();
// 根据用户名获取密码
String password = getPasswordForUser(username);
if (password == null) {
throw new UnknownAccountException("用户不存在");
}
return new SimpleAuthenticationInfo(username, password, getName());
}
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
String username = (String) principals.getPrimaryPrincipal();
Set<String> roles = getRolesForUser(username);
Set<String> permissions = getPermissionsForUser(username);
return new SimpleAuthorizationInfo(roles).addStringPermissions(permissions);
}
private String getPasswordForUser(String username) {
// 从数据库或缓存中获取密码
return "password";
}
private Set<String> getRolesForUser(String username) {
// 获取用户角色
return new HashSet<>(Arrays.asList("admin", "user"));
}
private Set<String> getPermissionsForUser(String username) {
// 获取用户权限
return new HashSet<>(Arrays.asList("user:read", "user:write"));
}
}
控制访问
使用Shiro进行访问控制非常简单。以下是一个简单的例子:
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authz.AuthorizationException;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.apache.shiro.authz.annotation.RequiresRoles;
import org.apache.shiro.subject.Subject;
public class MyController {
@RequiresRoles("admin")
@RequiresPermissions("user:write")
public void doSomething() {
// 只有具有admin角色和user:write权限的用户才能访问
}
}
总结
通过本文的实操解析,你现在已经对Shiro权限配置有了基本的了解。Shiro是一个功能强大的框架,能够帮助你轻松实现企业级的安全控制。随着实践的深入,你会逐渐掌握更多的Shiro高级特性。
