场景:平台数据分一级机构、二级机构。当一级机构的账户登录,可以看到该机构下所有二级机构的数据;当二级机构账户登录,只能看到当前二级机构数据。
架构:springboot + mybatisplus3.1 + mysql
考虑平台操作性能,如何处理这样的场景?
关于#java#的问题:当一级机构的账户登录,可以看到该机构下所有二级机构的数据
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
1条回答 默认 最新
关注建议你数据权限控制使用Spring Security,实现数据权限控制,以确保一级机构仅能访问其下属二级机构的数据。可以在登录时对用户进行身份验证,同时查询其所属机构信息,并将该信息保存在当前用户的会话中。对于二级机构用户,只需从会话中读取其所属机构信息。
==
参考我们站内博客(这两个里面有非常详细的讲解,包括图示讲解,可以直接参考学习)
https://blog.csdn.net/HYDCS/article/details/108185976
https://blog.csdn.net/jpgzhu/article/details/120995403
==示例代码和解释:
假设我们有一个基于Spring框架的Web应用程序,其中包含一个名为Organization的实体类,用于表示组织机构信息。Organization实体类中包含一个parentId字段,用于表示该组织机构的上级机构ID。
我们可以使用Spring Security来实现数据权限控制,以确保一级机构仅能访问其下属二级机构的数据。
以下是一个简单的示例(参考自ChatGPT,其实上面博客里面也有,只是部分实现细节不同,大致方向你可以对比,基本一样的):
- 创建一个自定义的AccessDecisionVoter实现类,用于决定用户是否有权限访问某个组织机构。
public class OrganizationAccessDecisionVoter implements AccessDecisionVoter<Object> { @Override public boolean supports(ConfigAttribute attribute) { return true; } @Override public boolean supports(Class<?> clazz) { return true; } @Override public int vote(Authentication authentication, Object object, Collection<ConfigAttribute> attributes) { if (authentication == null) { return AccessDecisionVoter.ACCESS_DENIED; } // 获取当前用户的权限信息 Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities(); // 获取要访问的组织机构信息 Organization organization = (Organization) object; // 如果当前用户是管理员,则允许访问所有组织机构 for (GrantedAuthority authority : authorities) { if (authority.getAuthority().equals("ROLE_ADMIN")) { return AccessDecisionVoter.ACCESS_GRANTED; } } // 如果要访问的组织机构是当前用户所在的组织机构或其下属机构,则允许访问 Long currentOrganizationId = getCurrentUserOrganizationId(authentication); if (currentOrganizationId.equals(organization.getId()) || isSubOrganization(currentOrganizationId, organization)) { return AccessDecisionVoter.ACCESS_GRANTED; } return AccessDecisionVoter.ACCESS_DENIED; } /** * 获取当前用户所在的组织机构ID */ private Long getCurrentUserOrganizationId(Authentication authentication) { // TODO: 实现获取当前用户所在的组织机构ID的逻辑 return null; } /** * 判断给定的组织机构是否是当前用户所在组织机构的下属机构 */ private boolean isSubOrganization(Long currentOrganizationId, Organization organization) { // TODO: 实现判断给定的组织机构是否是当前用户所在组织机构的下属机构的逻辑 return false; } }- 在Spring Security配置文件中,配置OrganizationAccessDecisionVoter和相应的访问控制规则。
<beans:bean id="accessDecisionManager" class="org.springframework.security.access.vote.UnanimousBased"> <beans:constructor-arg> <beans:list> <beans:bean class="com.example.security.OrganizationAccessDecisionVoter" /> </beans:list> </beans:constructor-arg> </beans:bean> <http> <intercept-url pattern="/organizations/**" access="hasRole('ROLE_USER')" /> <access-denied-handler error-page="/403" /> </http> <authentication-manager> <authentication-provider> <user-service解决 无用评论 打赏 举报