springboot集成shiro权限管理简单实现

下面就为您讲解“SpringBoot集成Shiro权限管理简单实现”的详细攻略。

一、配置

1.1 引入依赖

在Maven或Gradle中引入Shiro和SpringBoot的相关依赖:

Maven:

<dependency>
  <groupId>org.apache.shiro</groupId>
  <artifactId>shiro-web</artifactId>
  <version>1.7.1</version> <!-- 版本可根据实际情况进行调整 -->
</dependency>

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

Gradle:

implementation 'org.apache.shiro:shiro-web:1.7.1' // 版本可根据实际情况进行调整
implementation 'org.springframework.boot:spring-boot-starter-web'

1.2 配置Shiro

在SpringBoot中使用Shiro,我们需要在配置类(通常是Application.java)中添加一个ShiroFilterFactoryBean和一个DefaultWebSecurityManager的Bean。

示例代码:

@Configuration
public class Application {

    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean() {
        //创建shiroFilterFactoryBean 实例
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        //设置SecurityManager
        shiroFilterFactoryBean.setSecurityManager(securityManager());
        //设置登录页面地址
        shiroFilterFactoryBean.setLoginUrl("/login");
        //设置无权限路径
        shiroFilterFactoryBean.setUnauthorizedUrl("/unauthorized");
        // 拦截器.
        Map<String, String> map = new HashMap<String, String>();
        // 配置不会被拦截的链接 顺序判断
        //anon:所有url都可以匿名访问
        map.put("/login", "anon");
        map.put("/static/**", "anon");  //静态资源不拦截
        map.put("/**", "authc");  //其他链接必须认证后才能访问
        shiroFilterFactoryBean.setFilterChainDefinitionMap(map);

        return shiroFilterFactoryBean;
    }

    @Bean
    public DefaultWebSecurityManager securityManager() {
        //创建securityManager实例
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        //设置realm
        securityManager.setRealm(myShiroRealm());
        return securityManager;
    }

    /**
     * 自定义realm
     */
    @Bean
    public MyShiroRealm myShiroRealm() {
        //创建realm实例
        MyShiroRealm myShiroRealm = new MyShiroRealm();
        return myShiroRealm;
    }
}

1.3 配置Realm

自定义的Realm需要继承org.apache.shiro.realm.AuthorizingRealm类,实现其中的protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals)和protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token)方法,完成授权和身份认证的逻辑。

示例代码:

public class MyShiroRealm extends AuthorizingRealm {

    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        //授权逻辑
        //获取当前用户
        User user = (User) principals.getPrimaryPrincipal();
        //创建授权对象
        SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
        //向授权对象中添加角色和权限
        authorizationInfo.addRoles(user.getRoles());
        authorizationInfo.addStringPermissions(user.getPermissions());
        return authorizationInfo;
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        //身份认证逻辑
        //获取用户输入的账号和密码
        UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;
        String username = usernamePasswordToken.getUsername();
        String password = new String(usernamePasswordToken.getPassword());
        //根据用户名查找数据库中的用户对象
        User user = userService.findByUsername(username);
        if (user == null) {
            throw new UnknownAccountException(); //账号不存在
        }
        if (!password.equals(user.getPassword())) {
            throw new IncorrectCredentialsException(); //密码错误
        }
        //创建身份认证对象
        return new SimpleAuthenticationInfo(user, password, getName());
    }
}

二、使用

2.1 创建用户实体类

public class User implements Serializable {

    private Integer id;
    private String username;
    private String password;
    private List<String> roles;
    private List<String> permissions;

    //省略getter和setter方法
}

2.2 设计登录页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
<body>
    <h1>登录</h1>
    <form action="/login" method="post">
        <p>用户名: <input type="text" name="username"></p>
        <p>密码: <input type="password" name="password"></p>
        <p><input type="submit" value="登录"></p>
    </form>
</body>
</html>

2.3 创建根据用户名查询用户的服务接口和实现类

public interface UserService {
    User findByUsername(String username);
}

@Service
public class UserServiceImpl implements UserService {

    @Override
    public User findByUsername(String username) {
        //模拟从数据库中查询用户
        if ("admin".equals(username)) {
            User user = new User();
            user.setUsername("admin");
            user.setPassword("123456");
            user.setRoles(Arrays.asList("admin"));
            user.setPermissions(Arrays.asList("user:select", "user:update", "user:delete"));
            return user;
        } else {
            return null;
        }
    }
}

2.4 编写授权和鉴权代码

在Controller中编写授权和鉴权代码,实现对鉴权失败的情况进行处理。

@RestController
public class UserController {

    @RequestMapping("/user/select")
    public String selectUser() {
        return "查询用户成功";
    }

    @RequestMapping("/user/update")
    public String updateUser() {
        return "更新用户信息成功";
    }

    @RequestMapping("/user/delete")
    public String deleteUser() {
        return "删除用户成功";
    }

    @RequestMapping("/unauthorized")
    public String unauthorized() {
        return "没有权限访问此页面";
    }
}

2.5 测试

完成上述步骤后,运行程序并访问localhost:8080/login,输入admin/123456登录后,访问/user/select、/user/update、/user/delete,应该能正常访问,否则将会跳转到unauthorized页面。

三、总结

至此,我们已经完成了SpringBoot集成Shiro权限管理的简单实现。在使用过程中需要注意:

  • 在自定义的Realm中返回的SimpleAuthenticationInfo对象中,第一个参数必须是用户对象。
  • 自定义的Realm必须添加到SecurityManager中。
  • 可以通过编写自定义的Filter实现更多的权限控制。
  • 若需要对部分用户进行特殊处理,可以重新实现AuthorizingRealm的授权方法。
  • 完整示例代码请参考GitHub上的开源项目。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springboot集成shiro权限管理简单实现 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • JSP技术简介

    JSP技术是运用Java语言的Web编程技术之一,以便于开发人员动态地生成HTML、XML或其他类型的Web页面。在JSP页面中,可以将静态内容、JSP标记和Java代码混合在一起来生成动态Web页面。 JSP页面结构 JSP页面以.jsp后缀作为文件后缀名。在JSP页面中,可以包含以下几种元素: 指令:指示服务器或容器如何翻译JSP页面,并且在整个页面中只…

    Java 2023年6月15日
    00
  • MyBatis使用Zookeeper保存数据库的配置可动态刷新的实现代码

    下面我将为你详细讲解使用Zookeeper保存数据库的配置并实现动态刷新的实现过程。本文主要分为以下几个部分: MyBatis使用Zookeeper保存数据库的配置的原理 实现动态刷新的流程 代码实现及示例说明 1. MyBatis使用Zookeeper保存数据库的配置的原理 MyBatis使用Zookeeper保存数据库的配置,可以将配置信息保存在Zook…

    Java 2023年6月16日
    00
  • cmd编译运行java程序的方法

    当我们需要编写并运行Java程序时,通常需要使用Java编译器和Java虚拟机(JVM)。在Windows系统上,我们可以使用命令行(cmd)来完成这些任务。下面是详细的攻略: 安装JDK 首先要确保已经安装了Java开发工具包(JDK),否则需要先从官方网站上下载并安装。 编写Java程序 接下来,我们要编写一个Java程序,并将其保存为.java文件。 …

    Java 2023年5月23日
    00
  • java基础检查和未检查异常处理详解

    Java基础检查和未检查异常处理详解 在Java开发中,异常处理是非常重要的一个方面。Java的异常分为两大类:检查异常和未检查异常。本文将详细讲解Java基础检查和未检查异常处理的完整攻略。 Java检查异常 检查异常是指在编译期就能检查出来的异常,如果不处理这些异常,编译器会报错,无法通过编译。为了避免这种情况的发生,我们必须在代码中处理这些异常。Jav…

    Java 2023年5月27日
    00
  • 详解如何通过Java实现压缩PDF文档

    我会详细讲解如何通过Java实现压缩PDF文档的完整攻略。 1. 背景介绍 PDF文件是常见的文档格式,在传输和存储时,通常需要进行压缩。使用Java程序实现PDF文件的压缩功能,在某些场景下是必不可少的。下面,将详细介绍如何使用Java实现对PDF文档的压缩。 2. 实现过程 2.1 准备工作 在开始实现压缩PDF文档功能之前,需要准备以下工具和环境: J…

    Java 2023年5月31日
    00
  • Sprint Boot @ConditionalOnProperty使用方法详解

    @ConditionalOnProperty是Spring Boot中的一个注解,它用于根据配置属性的值来决定是否启用或禁用某个组件。在使用Spring Boot开发应用程序时,@ConditionalOnProperty是非常有用的。本文将详细介绍@ConditionalOnProperty的作用和使用方法,并提供两个示例说明。 @ConditionalO…

    Java 2023年5月5日
    00
  • Java 编程中十个处理异常的建议

    Java 编程中十个处理异常的建议 对于 Java 程序员来说,异常处理是一项必不可少的技能。如何合理地处理异常,提高代码的健壮性和可维护性,是每个程序员都应该重视的问题。这里提供十个处理异常的建议,帮助大家更好地应对各种异常情况。 1. 避免捕获过于宽泛的异常 Java 中存在许多种异常类型,如 NullPointerException、ArrayInde…

    Java 2023年5月27日
    00
  • 基于tomcat配置文件server.xml详解

    针对“基于tomcat配置文件server.xml详解”的完整攻略,下面为您详细讲解。 一、什么是server.xml文件 在使用Tomcat时,server.xml文件是至关重要的配置文件,它可帮助我们定制类似主机名、端口、目录等重要的配置信息。通常,在Tomcat安装时会默认安装为webapps目录下conf/server.xml文件。 二、server…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部