欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

先了解一下Shiro安全框架

发布时间:2025/3/21 编程问答 47 豆豆
生活随笔 收集整理的这篇文章主要介绍了 先了解一下Shiro安全框架 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

 Shiro与Spring Security对比:


 Shiro的整体架构:


认识Shiro!!! 

官网:https://shiro.apache.org/

 

一. Shiro是什么
Shiro是一个Java平台的开源权限框架,用于认证和访问授权。具体来说,满足对如下元素的支持:

  • 用户,角色,权限(仅仅是操作权限,数据权限必须与业务需求紧密结合),资源(url)。
  • 用户分配角色,角色定义权限。
  • 访问授权时支持角色或者权限,并且支持多级的权限定义。

Q:对组的支持?
A:shiro默认不支持对组设置权限。

Q:是否可以满足对组进行角色分配的需求?
A:扩展Realm,可以支持对组进行分配角色,其实就是给该组下的所有用户分配权限。

Q:对数据权限的支持? 在业务系统中定义?
A:shiro仅仅实现对操作权限的控制,用于在前端控制元素隐藏或者显示,以及对资源访问权限进行检查。数据权限与具体的业务需求紧密关联,shiro本身无法实现对数据权限的控制。

Q:动态权限分配?
A:扩展org.apache.shiro.realm.Realm,支持动态权限分配。

Q:与Spring集成?
A:可以支持与Spring集成,shiro还支持jsp标签。


二. 系统架构

在shiro架构中,有3个最主要的组件:Subject,SecurityManager,Realm。
Subject本质上就是当前访问用户的抽象描述。
SecurityManager是Shiro架构中最核心的组件,通过它可以协调其他组件完成用户认证和授权。实际上,SecurityManager就是Shiro框架的控制器。
Realm定义了访问数据的方式,用来连接不同的数据源,如:LDAP,关系数据库,配置文件等等。


三. 如何使用Shiro
Shiro作为一个完善的权限框架,可以应用在多种需要进行身份认证和访问授权的场景,例如:
1. 在独立应用中使用shiro
http://www.cnblogs.com/nuccch/p/6780550.html 细说shiro之三:在独立应用中使用shiro

2. 在web应用中使用shiro
http://www.cnblogs.com/nuccch/p/6785167.html 细说shiro之四:在web应用中使用shiro

3. 在spring框架中集成shiro
http://www.cnblogs.com/nuccch/p/6790408.html 细说shiro之五:在spring框架中集成shiro

四. Shiro原理
1. 认证
通过调用Subject.login(token)方法开始用户认证流程。

Subject currentUser = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken(username, password); token.setRememberMe(true); try {currentUser.login(token); } catch (UnknownAccountException e) {logger.error(String.format("user not found: %s", username), e); // 用户不存在 } catch (IncorrectCredentialsException e) {logger.error(String.format("incorrent credentials: %s", username), e); // 密码不正确 } catch (ConcurrentAccessException e) {logger.error(String.format("user has been authenticated: %s", username), e); // 用户重复登录 } catch (AccountException e) {logger.error(String.format("account except: %s", username), e); // 其他账户异常 }

shiro用户认证时序图:

2. 授权
shiro访问授权有3种实现方式:api调用,java注解,jsp标签。
(1)在独立应用程序中访问授权通过api调用实现

String role = "schwartz"; Subject currentUser = SecurityUtils.getSubject(); if(currentUser.hasRole(role)) {//用户属于角色schwartz }else{//用户不属于角色schwartz }

(2)在spring框架中可以通过java注解

@RequiresPermissions(value={"log:manage:*"}) public ModelAndView home(HttpServletRequest req) {ModelAndView mv = new ModelAndView("home");return mv; }

(3)在JSP页面中还可以直接使用jsp标签

<!-- 使用shiro标签 --> <shiro:hasPermission name="log:manage:*"><a href="<%=request.getContextPath()%>/user/home">操作日志审计</a><br/> </shiro:hasPermission>

shiro访问授权时序图:

五. 注意事项
1.org.apache.shiro.realm.jdbc.JdbcRealm如果需要在授权时开启权限检查,必须设置permissionsLookupEnabled为true,否则只检查角色。
2.用户退出登录时,Shiro用户必须执行logout(),必须要注销Session信息,避免影响下一次用户认证和授权。

SecurityUtils.getSubject().logout(); req.getSession().invalidate();

3.如果在数据库中存储的用户密码为编码值(如MD5加密),则在发送登录请求时传递的密码参数也必须是MD5加密结果,否则认证失败。
4.shiro框架只能控制操作权限,不能控制数据权限。数据权限与具体的业务紧密关联,无法通过一个通用的框架完成,通常都是利用关系数据库查询过滤实现。
对操作权限的控制有2层含义,其一:用户在前端只能看到对应权限的元素;其二:在后端对用户操作进行权限检查。

总结

以上是生活随笔为你收集整理的先了解一下Shiro安全框架的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。