首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >权限框架使用指南之shiro:轻松搞定Java应用安全认证与授权!

权限框架使用指南之shiro:轻松搞定Java应用安全认证与授权!

作者头像
伯灵
发布2026-01-21 09:39:26
发布2026-01-21 09:39:26
1920
举报

Apache Shiro 是一个功能强大的安全框架,专注于认证、授权、加密以及会话管理。它非常适用于需要处理Java应用程序安全需求的开发者。以下是关于Shiro框架的详细使用教程,包括配置、认证、授权、会话管理等方面的深入讲解。

1. 引入Shiro依赖

首先,如果你正在使用Maven构建项目,需要将Shiro的依赖添加到pom.xml中。

代码语言:javascript
复制
<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-core</artifactId>
    <version>1.8.0</version>
</dependency>

如果你使用的是Gradle,可以使用如下依赖:

代码语言:javascript
复制
implementation 'org.apache.shiro:shiro-core:1.8.0'

2. Shiro配置方式

Shiro支持多种配置方式,常见的有INI配置文件和Java代码配置。

2.1 使用INI文件配置

INI文件配置是最常见的方式。你可以在src/main/resources目录下创建一个shiro.ini文件,并进行配置。

shiro.ini配置示例:

代码语言:javascript
复制
[main]
# 配置一个自定义的Realm
myRealm = com.example.MyRealm
securityManager.realms = $myRealm

[users]
# 用户信息:格式为 username = password, role
admin = 1234, adminRole
guest = guest123, guestRole

[roles]
# 角色与权限:格式为 role = permission
adminRole = *
guestRole = view, edit

[main]部分,我们配置了一个自定义的Realm,并将它添加到securityManager中。[users]部分是用户信息配置,[roles]部分是角色权限配置。

2.2 使用Java代码配置

你也可以使用Java配置来进行Shiro的配置,通常结合Spring框架使用。

Java代码配置示例:

代码语言:javascript
复制
@Configuration
public class ShiroConfig {

    @Bean
    public SecurityManager securityManager() {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(myRealm());
        return securityManager;
    }

    @Bean
    public Realm myRealm() {
        return new MyRealm();  // 自定义的Realm实现
    }

    @Bean
    public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        // 配置Shiro的URL过滤规则
        shiroFilterFactoryBean.setLoginUrl("/login");
        shiroFilterFactoryBean.setSuccessUrl("/home");
        return shiroFilterFactoryBean;
    }
}
3. 创建自定义Realm

Shiro的Realm是连接Shiro与数据源的桥梁,负责用户身份验证和权限检查。你需要继承AuthorizingRealm类来实现自己的Realm

3.1 实现AuthenticationRealm

doGetAuthenticationInfo方法用于认证过程,返回认证信息。

代码语言:javascript
复制
public class MyRealm extends AuthorizingRealm {

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        String username = (String) token.getPrincipal();
        String password = getPasswordFromDatabase(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 = getRolesFromDatabase(username);
        Set<String> permissions = getPermissionsFromDatabase(username);

        SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
        authorizationInfo.setRoles(roles);
        authorizationInfo.setStringPermissions(permissions);
        
        return authorizationInfo;
    }
}
3.2 权限配置

我们通过重写doGetAuthorizationInfo方法来获取用户的角色和权限。你可以在该方法中从数据库查询用户的角色和权限。

代码语言:javascript
复制
private Set<String> getRolesFromDatabase(String username) {
    // 查询数据库获取角色
    return new HashSet<>(Arrays.asList("admin", "user"));
}

private Set<String> getPermissionsFromDatabase(String username) {
    // 查询数据库获取权限
    return new HashSet<>(Arrays.asList("view", "edit"));
}

4. 用户认证:Login

Shiro提供了认证机制,通过Subject对象进行认证操作。Subject代表了当前的用户或客户端。

4.1 认证操作

你可以在登录时使用UsernamePasswordToken来封装用户名和密码,并调用subject.login(token)进行认证。

代码语言:javascript
复制
public class LoginService {

    @Autowired
    private Subject subject;

    public boolean login(String username, String password) {
        UsernamePasswordToken token = new UsernamePasswordToken(username, password);
        try {
            subject.login(token);
            return true;  // 登录成功
        } catch (AuthenticationException e) {
            return false;  // 登录失败
        }
    }
}
5. 用户授权:Authorization

授权是Shiro的一个核心功能,它管理用户的角色和权限。Shiro提供了多种授权方式,包括角色授权、权限授权等。

5.1 角色授权

使用subject.hasRole来检查用户是否具有某个角色:

代码语言:javascript
复制
public boolean hasRole(String role) {
    return subject.hasRole(role);  // 检查是否具有指定角色
}
5.2 权限授权

使用subject.isPermitted来检查用户是否具有某个权限:

代码语言:javascript
复制
public boolean hasPermission(String permission) {
    return subject.isPermitted(permission);  // 检查是否具有指定权限
}

6. 会话管理

Shiro的会话管理比Servlet的会话管理更加灵活。你可以通过Session对象存储和获取用户的会话数据。

6.1 存储数据到会话
代码语言:javascript
复制
public class SessionService {

    @Autowired
    private Session session;

    public void saveUserData(String data) {
        session.setAttribute("userData", data);
    }

    public String getUserData() {
        return (String) session.getAttribute("userData");
    }
}
6.2 会话过期和销毁

当用户退出时,可以通过session.stop()销毁会话。

代码语言:javascript
复制
public void logout() {
    session.stop();  // 销毁会话
}

7. Shiro与Spring的集成

Shiro可以与Spring框架无缝集成,允许你在Spring中管理SecurityManagerRealm等组件。通过@RequiresRoles@RequiresPermissions注解,你可以轻松地控制访问权限。

7.1 角色控制
代码语言:javascript
复制
@RequiresRoles("admin")
public class AdminController {

    @RequestMapping("/admin")
    public String adminPage() {
        return "adminPage";  // 只有admin角色用户才能访问此页面
    }
}

7.2 权限控制

代码语言:javascript
复制
@RequiresPermissions("edit")
public class EditController {

    @RequestMapping("/edit")
    public String editPage() {
        return "editPage";  // 只有具有edit权限的用户才能访问
    }
}
8. 总结

在本教程中,我们深入介绍了Shiro框架的配置、认证、授权、会话管理等基本功能,并提供了具体的代码示例。通过Shiro,你可以轻松实现Java应用程序的安全控制,确保用户的身份认证和权限授权符合要求。

结尾

如果你觉得这篇教程对你有所帮助,记得点赞、评论、关注哦!让我们一起在安全领域不断探索,共同进步!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-03-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 引入Shiro依赖
  • 2. Shiro配置方式
    • 2.1 使用INI文件配置
    • 2.2 使用Java代码配置
  • 3. 创建自定义Realm
    • 3.1 实现AuthenticationRealm
    • 3.2 权限配置
  • 4. 用户认证:Login
    • 4.1 认证操作
  • 5. 用户授权:Authorization
    • 5.1 角色授权
    • 5.2 权限授权
  • 6. 会话管理
    • 6.1 存储数据到会话
    • 6.2 会话过期和销毁
  • 7. Shiro与Spring的集成
    • 7.1 角色控制
  • 8. 总结
  • 结尾
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档