Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对某些已登录客户的只读访问| Spring MVC_Java_Spring_Jakarta Ee_Spring Mvc - Fatal编程技术网

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

Java 对某些已登录客户的只读访问| Spring MVC,java,spring,jakarta-ee,spring-mvc,Java,Spring,Jakarta Ee,Spring Mvc,我知道这似乎是一个奇怪的要求,但当客户需要时,这意味着我们别无选择。 我正在开发一个web应用程序(电子商务),需要注册一个新客户,到目前为止,一切都很正常。 但是,在以下情况下有要求 如果客户使用特定的电子邮件id注册,他们将立即获得批准,并允许浏览、查看所有内容,并允许执行任何交易 对于其他一组客户,他们可以登录,但他们对配置文件部分具有只读访问权限,并且不能查看产品的价格(折扣价格),也不允许进行任何交易 由于这些用例不适用于特定类别,而是适用于整个web应用程序,我不确定我们如何才能最好

我知道这似乎是一个奇怪的要求,但当客户需要时,这意味着我们别无选择。 我正在开发一个web应用程序(电子商务),需要注册一个新客户,到目前为止,一切都很正常。 但是,在以下情况下有要求

  • 如果客户使用特定的电子邮件id注册,他们将立即获得批准,并允许浏览、查看所有内容,并允许执行任何交易
  • 对于其他一组客户,他们可以登录,但他们对配置文件部分具有只读访问权限,并且不能查看产品的价格(折扣价格),也不允许进行任何交易
  • 由于这些用例不适用于特定类别,而是适用于整个web应用程序,我不确定我们如何才能最好地实现这一点。 我几乎没有什么选择

  • 在SpringSecurity下添加一个新角色,对于那些具有只读访问权限的用户,应该具有这个新角色
  • 创建某种类型的
    HandlerInterceptor
    ,它将在执行实际请求之前检查客户角色
  • 但我不确定我的思路是否正确,以及我们应该如何对此类客户实施只读访问。因为我们必须阻止此类客户

  • 更新他/她的个人资料
  • 更新密码
  • 配置文件中的任何其他更新
  • 不允许客户结账
  • 实际折扣价格不应可见
  • 我喜欢用允许的角色来注释控制器方法,但是如果您的操作很容易通过url和/或HTTP动词来区分,那么您可以使用url拦截器。任何一种解决方案都应该阻止他们执行任何不应该执行的操作


    然后,如果用户缺少某个角色,您还可以通过指定不同的视图(或在同一视图中使用)来限制用户可以查看的数据和/或链接。

    我将创建新角色,并按照@peter-g的建议使用

    如果您的电子商务是传统的web应用程序(服务器呈现的页面),则过滤URL不是最佳方法。在这种情况下,我将结合:

  • 服务层中的方法级别注释。只有
    @PreAuthorize
    注释放在对bean的入口调用中才有用。如果调用
    myService.methodA()
    ,并且此方法调用带注释的方法
    this.methodB()
    (这是
    myService()
    ),则安全注释将无法工作。它们只在第一次调用onmyservice时起作用(在本例中放置在
    methodA()
    )。这可以作为业务逻辑的安全防火墙
  • 基于角色的页面呈现链接/数据过滤。在JSP上,过滤掉与当前活动角色不对应的内容和链接(实际上是操作)。这有两个目的。第一,向特定角色显示特定内容。第二,是避免用户访问您的业务逻辑的第一个安全屏障。您甚至没有向他们显示特定的操作对他们可用
  • 鉴于此,用户将永远无法单击任何按钮/链接来访问受保护的资源。如果您遗漏了任何操作,服务层注释将充当保护特权操作执行的最终防火墙。就像过滤超媒体/数据一样,你也可以过滤价格


    如果您的后端是一个web API,您可以使用带有注释或XML/Java配置的URL过滤,并使用jackson视图(如果您使用JSON)或XSLT(如果使用XML)过滤输出。它允许更细粒度的控制和更内聚的安全实现。

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

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

    您通常在UserDetailsService的实现中确定当前用户的角色。您可以使用org.springframework.security.core.authority.SimpleGrantedAuthority作为授权实现(在您的上下文中,授权与角色是相同的)。从UserDetailsService返回的授权存储在用户的身份验证对象中,并在用户会话有效期内可用

    这种方法还允许您轻松地将用户从只读模式更改为完全模式(例如,在批准注册后),方法是在用户在批准后的下一次登录期间添加“完全访问”角色

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

     if (request.isUserInRole("FULL_ACCESS")) {
          // Only for users with full acccess
     }
    
    对于声明性授权(在配置文件中声明的授权或作为代码注释声明的授权),您可以使用

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

    SpringSecurity还提供了一组可能有助于为不同类型的用户正确呈现UI的工具


    您可以使用上述技术的组合来实施问题中提到的所有5个业务逻辑点。

    感谢您的输入……我知道授权标签……但我必须向所有客户显示链接/部分,只有具有只读访问权限的客户才能阅读。