当前位置: 首页 > news >正文

SpringBoot+Shiro权限管理

一、为什么要了解权限框架
        权限管理框架属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则用户可以访问而且只能访问自己被授权的资源。

        目前常见的权限框架有Shiro和Spring Security,本篇文章记录springboot整合shiro,实现简单的权限控制。

二、shiro介绍
        Shiro全称是Apache Shiro,是一款灵活、强大的安全框架。方便简洁的处理身份认证、授权、加密等。

        shiro的三个组件:

        Subject 【主体】:指代当前用户【人、爬虫等】

        SecurityManager【安全管理器】:管理所有的Subject、具体安全操作的真正执行者。

        Reamls:本质是一个安全的DTO,用于进行权限、认证信息;

        通过Subject来进行认证和授权,而Subject又委托给SecurityManager; 需要给Shrio的SecurityManager注入Realm,从而让SecurityManager能得到合法的用户及其权限进行判断。

以下是一个简单的Spring Boot + Shiro权限管理示例,包含以下步骤:

1. 创建 Spring Boot 项目

可以使用 Spring Initializr(https://start.spring.io/)创建一个新的 Spring Boot 项目,添加Webthymeleaf依赖(用于示例中的简单页面展示)

2. 添加 Shiro 依赖

pom.xml文件中添加 Shiro 相关依赖

<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring-boot-web-starter</artifactId><version>1.7.1</version>
</dependency>

3. 创建实体类用户实体类(User)

public class User {private Long id;private String username;private String password;// 可以添加更多用户相关的属性,如角色列表等// 构造函数、Getter和Setter方法public User() {}public User(String username, String password) {this.username = username;this.password = password;}// Getter和Setter方法public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}

4. 创建 Shiro 配置类 

@Configuration
public class ShiroConfig {@Beanpublic ShiroFilterFactoryBean shiroFilterFactoryBean(DefaultWebSecurityManager securityManager) {ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();shiroFilterFactoryBean.setSecurityManager(securityManager);// 配置登录页面shiroFilterFactoryBean.setLoginUrl("/login");// 配置未授权访问页面shiroFilterFactoryBean.setUnauthorizedUrl("/unauthorized");// 配置过滤器链Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();// 对静态资源放行filterChainDefinitionMap.put("/css/**", "anon");filterChainDefinitionMap.put("/js/**", "anon");// 登录页面放行filterChainDefinitionMap.put("/login", "anon");// 其他请求需要认证filterChainDefinitionMap.put("/**", "authc");shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);return shiroFilterFactoryBean;}@Beanpublic DefaultWebSecurityManager securityManager() {DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();securityManager.setRealm(userRealm());return securityManager;}@Beanpublic UserRealm userRealm() {return new UserRealm();}
}

5. 创建自定义 Realm 

public class UserRealm extends AuthorizingRealm {// 模拟用户数据存储,可以替换为数据库查询private Map<String, User> userMap = new HashMap<>();public UserRealm() {userMap.put("user1", new User("user1", "password1"));userMap.put("admin", new User("admin", "adminpassword"));}@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();// 这里可以根据用户角色等信息添加权限,示例简单处理if ("admin".equals(principals.getPrimaryPrincipal())) {authorizationInfo.addRole("admin");}return authorizationInfo;}@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;String username = usernamePasswordToken.getUsername();User user = userMap.get(username);if (user == null) {throw new UnknownAccountException("用户不存在");}return new SimpleAuthenticationInfo(user.getUsername(), user.getPassword(), getName());}
}

6. 创建控制器(Controller) 

@Controller
public class LoginController {@PostMapping("/login")public String login(String username, String password, Model model) {Subject subject = SecurityUtils.getSubject();UsernamePasswordToken token = new UsernamePasswordToken(username, password);try {subject.login(token);return "redirect:/index";} catch (AuthenticationException e) {model.addAttribute("error", "用户名或密码错误");return "login";}}@GetMapping("/login")public String showLoginPage() {return "login";}@GetMapping("/unauthorized")public String unauthorized() {return "unauthorized";}@GetMapping("/index")public String index() {return "index";}
}

前端页面大家可以自己去实现了。 

总结:实现了一个简单的Spring Boot + Shiro权限管理系统,用户可以登录,并且根据角色(这里简单示例了普通用户和管理员)显示不同的内容。在实际应用中,需要将用户数据存储替换为数据库操作,并完善权限管理的逻辑。

 


http://www.mrgr.cn/news/62729.html

相关文章:

  • 【Android】使用TextView实现按钮开关代替Switch开关
  • Java:网络初识
  • Ubuntu 24 配置vsftp
  • PostgreSQL 时间函数操作
  • 1436. 旅行终点站
  • 查询 linux 中是否出现OOM
  • [ 应急响应靶场实战 ] VMware 搭建win server 2012应急响应靶机 攻击者获取服务器权限上传恶意病毒 防守方人员应急响应并溯源
  • 信息管理与信息系统专业的建设与发展 ——人才培养模式探讨
  • shell基础-case
  • golang rocketmq开发
  • 谷歌seo发外链真的能提升排名吗?
  • ios上架流程
  • DBeaver24.2.3 中安装yashandb驱动
  • 淘宝API接口(item_search- 关键词搜索淘宝商品列表数据查询)
  • 基于单片机的智能家居排气扇系统设计
  • 外贸单证小技巧,Winseeing汇信外贸软件让制单事半功倍
  • Es 基础操作 增删改查
  • Spring Cloud Gateway
  • 深度学习常见面试题及答案(41~45)
  • 动态规划 —— 路径问题-下降路径最小和
  • 什么是x86架构,什么是arm架构
  • 算法竞赛——02基本算法
  • AI机西好用吗?有哪些实用功能?真实用户体验告诉你!
  • 网鼎杯2024青龙组官方资格赛wp
  • 接入AI后,开源项目顿时有趣了
  • JVM(HotSpot):finally块的相关问题