广告
返回顶部
首页 > 资讯 > 精选 >SpringBoot2如何整合Shiro框架实现用户权限管理
  • 708
分享到

SpringBoot2如何整合Shiro框架实现用户权限管理

2023-06-02 11:06:37 708人浏览 八月长安
摘要

小编给大家分享一下SpringBoot2如何整合shiro框架实现用户权限管理,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、Shiro简介1、基础概念Apac

小编给大家分享一下SpringBoot2如何整合shiro框架实现用户权限管理,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

一、Shiro简介

1、基础概念

Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。作为一款安全框架Shiro的设计相当巧妙。Shiro的应用不依赖任何容器,它不仅可以在JavaEE下使用,还可以应用在JavaSE环境中。

2、核心角色

1)Subject:认证主体

代表当前系统的使用者,就是用户,在Shiro的认证中,认证主体通常就是userName和passWord,或者其他用户相关的唯一标识。

2)SecurityManager:安全管理器

Shiro架构中最核心的组件,通过它可以协调其他组件完成用户认证和授权。实际上,SecurityManager就是Shiro框架的控制器。

3)Realm:域对象

定义了访问数据的方式,用来连接不同的数据源,如:关系数据库,配置文件等等。

3、核心理念

Shiro自己不维护用户和权限,通过Subject用户主体和Realm域对象的注入,完成用户的认证和授权。

二、整合springBoot2框架

1、核心依赖

<dependency>    <groupId>org.apache.shiro</groupId>    <artifactId>shiro-core</artifactId>    <version>1.4.0</version></dependency><dependency>    <groupId>org.apache.shiro</groupId>    <artifactId>shiro-spring</artifactId>    <version>1.4.0</version></dependency>

2、Shiro核心配置

@Configurationpublic class ShiroConfig {        @Bean("sessionManager")    public SessionManager sessionManager(){        DefaultWEBSessionManager sessionManager = new DefaultWebSessionManager();        //设置session过期时间        sessionManager.setGlobalSessionTimeout(60 * 60 * 1000);        sessionManager.setSessionValidationSchedulerEnabled(true);        // 去掉shiro登录时url里的jsESSIONID        sessionManager.setSessionIdUrlRewritingEnabled(false);        return sessionManager;    }        @Bean("securityManager")    public SecurityManager securityManager(UserRealm userRealm, SessionManager sessionManager) {        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();        securityManager.setSessionManager(sessionManager);        securityManager.setRealm(userRealm);        return securityManager;    }        @Bean("shiroFilter")    public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {        ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();        shiroFilter.setSecurityManager(securityManager);        shiroFilter.setLoginUrl("/userLogin");        shiroFilter.setUnauthorizedUrl("/");        Map<String, String> filterMap = new LinkedHashMap<>();        filterMap.put("/userLogin", "anon");        shiroFilter.setFilterChainDefinitionMap(filterMap);        return shiroFilter;    }        @Bean("lifecycleBeanPostProcessor")    public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {        return new LifecycleBeanPostProcessor();    }        @Bean    public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {        DefaultAdvisorAutoProxyCreator proxyCreator = new DefaultAdvisorAutoProxyCreator();        proxyCreator.setProxyTargetClass(true);        return proxyCreator;    }        @Bean    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {        AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();        advisor.setSecurityManager(securityManager);        return advisor;    }}

3、域对象配置

@Componentpublic class UserRealm extends AuthorizingRealm {    @Resource    private SysUserMapper sysUserMapper ;    @Resource    private SysMenuMapper sysMenuMapper ;        @Override    public AuthorizationInfo doGetAuthorizationInfo    (PrincipalCollection principals) {        SysUserEntity user = (SysUserEntity)principals.getPrimaryPrincipal();        if(user == null) {            throw new UnknownAccountException("账号不存在");        }        List<String> permsList;        //默认用户拥有最高权限        List<SysMenuEntity> menuList = sysMenuMapper.selectList();        permsList = new ArrayList<>(menuList.size());        for(SysMenuEntity menu : menuList){            permsList.add(menu.getPerms());        }        //用户权限列表        Set<String> permsSet = new HashSet<>();        for(String perms : permsList){            if(StringUtils.isEmpty(perms)){                continue;            }            permsSet.addAll(Arrays.asList(perms.trim().split(",")));        }        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();        info.setStringPermissions(permsSet);        return info;    }        @Override    protected AuthenticationInfo doGetAuthenticationInfo(            AuthenticationToken authToken) throws AuthenticationException {        UsernamePasswordToken token = (UsernamePasswordToken)authToken;        //查询用户信息        SysUserEntity user = sysUserMapper.selectOne(token.getUsername());        //账号不存在        if(user == null) {            throw new UnknownAccountException("账号或密码不正确");        }        //账号定        if(user.getStatus() == 0){            throw new LockedAccountException("账号已被锁定,请联系管理员");        }        SimpleAuthenticationInfo info = new SimpleAuthenticationInfo                (user, user.getPassword(),                        ByteSource.Util.bytes(user.getSalt()),                        getName());        return info;    }    @Override    public void setCredentialsMatcher(CredentialsMatcher credentialsMatcher) {        HashedCredentialsMatcher shaCredentialsMatcher = new HashedCredentialsMatcher();        shaCredentialsMatcher.setHashAlGorithmName(ShiroUtils.hashAlgorithmName);        shaCredentialsMatcher.setHashIterations(ShiroUtils.hashIterations);        super.setCredentialsMatcher(shaCredentialsMatcher);    }}

4、核心工具

public class ShiroUtils {        public final static String hashAlgorithmName = "SHA-256";        public final static int hashIterations = 16;    public static String sha256(String password, String salt) {        return new SimpleHash(hashAlgorithmName, password, salt, hashIterations).toString();    }    // 获取一个测试账号 admin    public static void main(String[] args) {        // 3743a4c09a17e6f2829febd09ca54e627810001cf255ddcae9dabd288a949c4a        System.out.println(sha256("admin","123")) ;    }        public static Session getSession() {        return SecurityUtils.getSubject().getSession();    }        public static Subject getSubject() {        return SecurityUtils.getSubject();    }    public static SysUserEntity getUserEntity() {        return (SysUserEntity)SecurityUtils.getSubject().getPrincipal();    }    public static Long getUserId() {        return getUserEntity().getUserId();    }    public static void setSessionAttribute(Object key, Object value) {        getSession().setAttribute(key, value);    }    public static Object getSessionAttribute(Object key) {        return getSession().getAttribute(key);    }    public static boolean isLogin() {        return SecurityUtils.getSubject().getPrincipal() != null;    }    public static void logout() {        SecurityUtils.getSubject().logout();    }}

5、自定义权限异常提示

@RestControllerAdvicepublic class ShiroException {    @ExceptionHandler(AuthorizationException.class)    public String authorizationException (){        return "抱歉您没有权限访问该内容!";    }    @ExceptionHandler(Exception.class)    public String handleException(Exception e){        return "系统异常!";    }}

三、案例演示代码

1、测试接口

@RestControllerpublic class ShiroController {    private static Logger LOGGER = LoggerFactory.getLogger(ShiroController.class) ;    @Resource    private SysMenuMapper sysMenuMapper ;        @RequestMapping("/userLogin")    public void userLogin (            @RequestParam(value = "userName") String userName,            @RequestParam(value = "passWord") String passWord){        try{            Subject subject = ShiroUtils.getSubject();            UsernamePasswordToken token = new UsernamePasswordToken(userName, passWord);            subject.login(token);            LOGGER.info("登录成功");        }catch (Exception e) {            e.printStackTrace();        }    }        @RequestMapping("/menu/list")    @RequiresPermissions("sys:user:shiro")    public List list(){        return sysMenuMapper.selectList() ;    }        @RequestMapping("/menu/list2")    @RequiresPermissions("ccc:DDD:bbb")    public List list2(){        return sysMenuMapper.selectList() ;    }        @RequestMapping("/userLogOut")    public String logout (){        ShiroUtils.logout();        return "success" ;    }}

2、测试流程

1)、登录后取得权限Http://localhost:7011/userLogin?userName=admin&passWord=admin2)、访问有权限接口http://localhost:7011/menu/list3)、访问无权限接口http://localhost:7011/menu/list24)、退出登录http://localhost:7011/userLogOut

以上是“SpringBoot2如何整合Shiro框架实现用户权限管理”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: SpringBoot2如何整合Shiro框架实现用户权限管理

本文链接: https://www.lsjlt.com/news/229994.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SpringBoot2如何整合Shiro框架实现用户权限管理
    小编给大家分享一下SpringBoot2如何整合Shiro框架实现用户权限管理,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、Shiro简介1、基础概念Apac...
    99+
    2023-06-02
  • SpringBoot整合Shiro框架,实现用户权限管理
    目录一、Shiro简介 核心角色核心理念 二、整合SpringBoot2框架  1、核心依赖2、Shiro核心配置3、域对象配置4、核心工具类5、自定义权限异常提...
    99+
    2022-11-12
  • SpringBoot2 整合SpringSecurity框架是怎么实现用户权限安全管理
    这篇文章给大家介绍SpringBoot2 整合SpringSecurity框架是怎么实现用户权限安全管理,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、Security简介1、基础概念Spring Security是...
    99+
    2023-06-05
  • SpringBoot2 高级应用(12):整合 SpringSecurity 框架,实现用户权限安全管理
    本文源码:GitHub·点这里 || GitEE·点这里一、Security简介1、基础概念Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring...
    99+
    2023-06-02
  • 基于SSM+Shiro+Bootstrap实现用户权限管理系统
    目录引言需求效果图功能细节数据表准备pom文件项目结构核心源码Shiro退出登录启动项目命令引言 本篇博文基于SSM+Shiro实现用户权限管理系统,每位用户只可访问指定的页面,具体...
    99+
    2022-11-12
  • 如何使用Spring Boot+Shiro实现权限管理
    这篇文章主要介绍如何使用Spring Boot+Shiro实现权限管理,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一:配置pom.xml文件<dependency><groupId>org....
    99+
    2023-06-02
  • 使用spring通过整合shiro如何实现数据库设与计权限管理功能
    本篇文章为大家展示了使用spring通过整合shiro如何实现数据库设与计权限管理功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。首先要先设计好我们的数据库,先来看一张比较粗糙的数据库设计图:具体...
    99+
    2023-05-31
    spring shiro 数据库
  • 如何实现mysql用户权限管理
    这篇文章主要讲解了如何实现mysql用户权限管理,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。本文内容:什么是用户权限恰当的用户权限查看权限修改权限删除权限首发日期:2018-...
    99+
    2022-10-18
  • Mysql如何实现用户权限管理
    小编给大家分享一下Mysql如何实现用户权限管理,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1. MySQL 权限介绍mysql中存在4个控制权限的表,分别为u...
    99+
    2023-06-15
  • MySQL如何实现用户管理与权限管理
    这篇文章主要为大家展示了“MySQL如何实现用户管理与权限管理”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“MySQL如何实现用户管理与权限管理”这篇文章吧。 ...
    99+
    2022-10-18
  • 数据库中如何实现普通用户服务特殊管理权限
    这篇文章主要介绍数据库中如何实现普通用户服务特殊管理权限,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! 普通用户服务生成AWR报告权限:grant se...
    99+
    2022-10-19
  • 麒麟操作系统中的多用户和权限管理如何实现
    麒麟操作系统是一款基于Linux内核的自主研发的操作系统,其中多用户和权限管理是麒麟操作系统的重要功能之一。下面是麒麟操作系统中多用...
    99+
    2023-10-10
    麒麟操作系统
  • 如何使用MySQL和Ruby实现一个简单的用户权限管理功能
    要实现一个简单的用户权限管理功能,可以按照以下步骤使用MySQL和Ruby:1. 创建一个MySQL数据库和相应的表来存储用户信息和...
    99+
    2023-10-20
    MySQL
  • 如何设计一个安全的MySQL表结构来实现用户权限管理功能?
    如何设计一个安全的MySQL表结构来实现用户权限管理功能?在现代的软件系统中,用户权限管理是非常重要的一个功能。通过合理的设计和管理,我们可以确保用户的数据安全,并且防止未授权的用户访问敏感信息。在本文中,我们将介绍如何设计一个安全的MyS...
    99+
    2023-10-31
    安全 MySQL 权限管理
  • 如何使用PHP和LDAP实现用户组管理和授权
    要使用PHP和LDAP实现用户组管理和授权,需要遵循以下步骤:1. 连接到LDAP服务器:使用`ldap_connect()`函数连...
    99+
    2023-08-28
    PHP
  • 如何实现CMD命令行中以管理员权限启动应用程序
    本篇内容主要讲解“如何实现CMD命令行中以管理员权限启动应用程序”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何实现CMD命令行中以管理员权限启动应用程序”吧!很多时候我们需要管理员权限来运行...
    99+
    2023-06-08
  • 如何使用SQL语句在MongoDB中实现数据权限控制和访问管理?
    如何使用SQL语句在MongoDB中实现数据权限控制和访问管理?MongoDB是一种面向文档的NoSQL数据库,而SQL(Structured Query Language)是关系型数据库管理系统的标准语言。尽管MongoDB不支持SQL的...
    99+
    2023-12-17
    MongoDB SQL语句 数据权限控制
  • 详解Java如何使用集合来实现一个客户信息管理系统
    目录1 客户类2 主界面3 方法(1)添加客户(2)判断编号是否被占用(3)修改客户信息(4)删除客户(5)客户列表(6)退出4 问题总结(1)字符串比较问题(2)修改客户不成功(3...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作