java - spring security认证添加子域

标签 java spring spring-mvc spring-security subdomain

我正在尝试构建一个云解决方案,它将在子域上充当完全不同的应用程序。我现在面临的问题是在注册和登录期间处理这个子域。我们使用spring表单登录进行登录。每个注册的用户都应被视为仅该特定子域的用户,并且不应允许他从其他子域登录。所有子域都是动态创建的子域。

例如,在“ogre.mydomain.com”中拥有帐户的名为“shrek”的用户不应被允许从“human.mydomain.com”登录,除非从“human.mydomain.com”注册。 com”具有相同的名称或不同的名称。

我尝试过的

我尝试将子域与用户关联,并通过在登录期间将子域附加到用户名来验证用户。

这种方法的问题是每次我在 Controller 中请求主体时,我都会将域作为用户名的一部分。

我只是想知道是否有更好的方法来做到这一点。

最佳答案

您应该做的是为每个子域指定一个角色,而不是在用户名中使用子域。

当用户在 ogre.mydomain.com 中注册名为 shr​​ek 时,该用户将自动获得名为 ROLE_OGRE_USER 的角色,并具有遵循 Spring 安全限制。

public class MyVoter extends RoleVoter {
  public int vote(Authentication authentication,
                java.lang.Object object,
                java.util.Collection<ConfigAttribute> attributes) {
    FilterInvocation filterInvocation = (FilterInvocation) object;
    HttpRequest request = filterInvocation.getHttpRequest();
    // get subdomain from request
    String subdomain = getSubdomain(request);
    if ("ogre".equals(subdomain)) {
      if(authentication.getAuthorities().contains(new SimpleGrantedAuthority("ROLE_OGRE_USER"))) {
         return ACCESS_GRANTED;
      } else {
         return ACCESS_DENIED;
      }
    }
    else {
      return super.vote(authentication, object, attributes);
    }
  }
}

<security:http auto-config="true" use-expressions="true" 
           access-decision-manager-ref="accessDecisionManager"

</security:http>

<bean id="accessDecisionManager"
  class="org.springframework.security.access.vote.UnanimousBased">
<property name="decisionVoters">
    <list>
        <bean class="MyVoter" />
    </list>
</property>

阅读此内容 SO post

关于java - spring security认证添加子域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32471839/

相关文章:

java - 启动 Tomcat 时 Web 模块没有从核心模块中找到类

java - 访问 JSP 中的对象列表时出现 NumberFormatException

java - Spring 5.0.7 与树脂服务器上的 Hibernate 5.4.1

Java : Compare same objects that they have same properties but do not points a same point in memory

java - 无法将类型 'java.lang.String' 的属性值转换为属性 'com.mongodb.ServerAddress[]' 所需的类型 'replicaSetSeeds'

spring - 如何使用 Spring Data REST 更新 @ManyToOne 关系?

java - 如何在 Spring Boot REST API 中启用 JSON/Jackson @RequestBody 的严格验证?

java - Weblogic Spring 安全 "A universal match pattern ('/* *') defined before other patterns"

java - int 不能被取消引用,将 int 值从数组转换为字符串

java - 如何在JAVA Swing中的表中添加CheckBox对象