只读访问某些登录客户| Spring的MVC

Ume*_*thi 6 java spring spring-mvc java-ee

我知道这似乎是一个奇怪的要求,但当客户想要它时意味着我们别无选择.我正在开发一个Web应用程序(电子商务),需要注册一个新客户,直到现在一切都运行良好.但是有以下情况需要

  1. 如果客户注册了某个电子邮件ID,他们将立即获得批准,并将被允许浏览,查看所有内容并允许执行任何交易.
  2. 对于其他客户群,他们可以登录,但他们只能访问该个人资料部分,也看不到产品的价格(折扣价)以及不允许进行任何交易.

由于这些用例不适用于某些类别,而是适用于整个Web应用程序,因此我不确定如何才能实现这一目标.我想到的选择很少

  1. 在spring security下添加一个新角色,对于那些只读访问权限的人,应该有这个新角色.
  2. 创建某种HandlerInterceptor在执行实际请求之前检查客户角色的方法.

但不确定我是否正在考虑正确的方向,以及我们应该如何强制执行只读访问此类客户.因为我们必须阻止这样的客户

  1. 更新他/她的个人资料
  2. 更新密码.
  3. 该配置文件中的任何其他更新
  4. 不允许客户结账
  5. 实际折扣价格不应该是可见的

Vla*_*fer 3

最好的方法是采用简单的基于角色的访问控制机制(RBAC)。Spring Security 很好地支持了这一点并且易于使用。

您应该创建一个新角色(例如“FULL_ACCESS”)并根据用户的电子邮件地址将其分配给正确的用户。该角色应涵盖具有完全访问权限的用户,而不是您的问题所建议的具有只读权限的用户。

您通常在 UserDetailsS​​ervice 的实现中确定当前用户的角色。您可以使用 org.springframework.security.core.authority.SimpleGrantedAuthority 作为您的 GrantedAuthority 实现(在您的上下文中,GrantedAuthority 与 Role 相同)。从 UserDetailsS​​ervice 返回的 GrantedAuthorities 存储在用户的 Authentication 对象内,并在用户的会话有效期内可用。

此方法还允许您通过在批准后用户下次登录期间添加“FULL_ACCESS”角色,轻松地将用户从只读模式更改为完整模式(例如,在批准注册后)。

填充 GrantedAuthorities 后,您可以使用声明式和编程式授权方式。对于编程授权(直接在代码中完成授权),请使用例如:

 if (request.isUserInRole("FULL_ACCESS")) {
      // Only for users with full acccess
 }
Run Code Online (Sandbox Code Playgroud)

对于声明性授权(在配置文件中声明的授权或作为代码注释的授权),您可以使用方面或注释来保护方法调用

您还可以使用基于表达式的访问控制以声明方式保护 URL ,但前两种方法更合适。具有完全和只读访问权限的用户可以访问相同的 URL,这使得该技术很难用于您的用例。

Spring Security 还提供了一组授权 JSP 标签,可以帮助您为不同类型的用户正确呈现 UI。

您可以结合使用上述技术来强制执行问题中提到的所有 5 个业务逻辑点。