您的位置:首页 > 汽车 > 时评 > 做网站哪个公司比较好_企业营销管理制度_前端seo怎么优化_app拉新佣金排行榜

做网站哪个公司比较好_企业营销管理制度_前端seo怎么优化_app拉新佣金排行榜

2024/11/16 4:49:36 来源:https://blog.csdn.net/SOS5418818845/article/details/143191591  浏览:    关键词:做网站哪个公司比较好_企业营销管理制度_前端seo怎么优化_app拉新佣金排行榜
做网站哪个公司比较好_企业营销管理制度_前端seo怎么优化_app拉新佣金排行榜

在 Java 安全领域,Apache Shiro 以其强大的功能和灵活性备受开发者青睐。其中,授权机制是 Shiro 的核心功能之一,它确保了用户只能访问其被授权的资源。本文将深入探讨 Shiro 授权,涵盖静态和动态授权、权限、角色、隐式角色、显式角色、授权流程以及授权方式等方面。

一、Shiro 简介

Apache Shiro 是一个功能强大的 Java 安全框架,它提供了认证、授权、加密和会话管理等功能。Shiro 的设计目标是简化安全开发,使开发人员能够专注于业务逻辑,而不必过多关注安全细节。

二、权限与角色的概念

(一)权限

权限是对特定资源的操作许可。例如,对文件的读取、写入、删除权限,对数据库的查询、插入、更新、删除权限等。在 Shiro 中,权限通常用字符串表示,如 “file:read” 表示对文件的读取权限。

(二)角色

角色是一组权限的集合。它代表了用户在系统中的职能或职责。例如,管理员角色可能拥有对系统的所有权限,而普通用户角色可能只有部分权限。在 Shiro 中,角色也用字符串表示,如 “admin” 表示管理员角色。

(三)隐式角色与显式角色

  1. 隐式角色:隐式角色是通过权限推断出来的角色。例如,如果一个用户拥有 “file:read” 和 “file:write” 权限,那么可以推断出该用户可能具有 “文件编辑者” 这个隐式角色。隐式角色的优点是可以灵活地根据权限动态确定用户的角色,而不需要在系统中显式地定义所有角色。
  2. 显式角色:显式角色是在系统中明确定义的角色。例如,在系统配置文件中或数据库中定义的 “admin”、“user” 等角色。显式角色的优点是易于理解和管理,开发人员可以清楚地知道用户的角色和相应的权限。

三、授权流程

(一)用户认证

在进行授权之前,用户首先需要进行认证。认证是验证用户身份的过程,通常通过用户名和密码进行。Shiro 提供了多种认证方式,如用户名 / 密码认证、LDAP 认证、数据库认证等。

(二)获取用户信息

一旦用户认证成功,Shiro 会获取用户的身份信息,包括用户名、角色和权限等。这些信息可以从数据库、LDAP 目录或其他数据源中获取。

(三)授权判断

在用户请求访问某个资源时,Shiro 会根据用户的角色和权限进行授权判断。如果用户拥有访问该资源的权限,则允许访问;否则,拒绝访问。授权判断可以基于静态授权或动态授权。

四、授权方式

(一)静态授权

  1. 定义与特点:静态授权是指在配置文件或代码中预先定义好用户的权限信息,这些权限信息在应用运行期间不会发生变化。静态授权的特点是简单直观、性能高效,适合权限较为固定的场景。
  2. 配置方式:
    • 在 XML 配置文件中,可以使用 <shiro:permission> 标签来定义用户的权限。例如:
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"><property name="securityManager" ref="securityManager"/><property name="loginUrl" value="/login.jsp"/><property name="unauthorizedUrl" value="/unauthorized.jsp"/><property name="filters"><map><entry key="authc" value-ref="formAuthenticationFilter"/></map></property><property name="filterChainDefinitions"><value>/login.jsp = authc/logout = logout/admin/** = roles[admin]/user/** = roles[user]</value></property>
</bean>

在上面的配置中,/admin/** 和 /user/** 分别定义了管理员和普通用户的访问路径,通过 roles[admin] 和 roles[user] 来指定相应的角色权限。

  • 在 Java 代码中,可以使用 IniSecurityManagerFactory 来加载配置文件,并创建 SecurityManager。然后,通过 Subject 对象来进行授权验证。例如:
IniSecurityManagerFactory factory = new IniSecurityManagerFactory("classpath:shiro.ini");
SecurityManager securityManager = factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);Subject currentUser = SecurityUtils.getSubject();
if (!currentUser.isAuthenticated()) {UsernamePasswordToken token = new UsernamePasswordToken("username", "password");token.setRememberMe(true);currentUser.login(token);
}if (currentUser.hasRole("admin")) {// 用户具有管理员角色,可以执行相应的操作
}

(二)动态授权

  1. 定义与特点:动态授权是指在应用运行期间,根据用户的身份、角色、请求参数等动态地确定用户的权限。动态授权的特点是灵活性高、可扩展性强,适合权限变化频繁、业务逻辑复杂的场景。
  2. 实现方式:
    • 使用 Shiro 的 AuthorizingRealm 类来实现自定义的授权逻辑。在 doGetAuthorizationInfo 方法中,可以根据用户的身份信息查询数据库或其他数据源,获取用户的权限信息,并返回给 Shiro。例如:

收起

java

复制

public class MyAuthorizingRealm extends AuthorizingRealm {@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {String username = (String) principals.getPrimaryPrincipal();SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();// 根据用户名查询数据库,获取用户的角色和权限信息List<String> roles = getUserRoles(username);List<String> permissions = getUserPermissions(username);authorizationInfo.addRoles(roles);authorizationInfo.addStringPermissions(permissions);return authorizationInfo;}
}
  • 在 Shiro 的过滤器中,可以通过实现 AccessControlFilter 接口来进行动态授权。在 onPreHandle 方法中,可以根据请求参数、用户身份等信息进行授权判断,并返回相应的结果。例如:
public class MyAccessControlFilter extends AccessControlFilter {@Overrideprotected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {Subject currentUser = getSubject(request, response);if (currentUser.isAuthenticated()) {// 用户已认证,根据请求参数进行授权判断String requestParam = request.getParameter("param");if (isAuthorized(requestParam)) {return true;}}return false;}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com