1

Spring Security我使用and创建了一个小而简单的 webapp SpringMVC,我正在尝试将其转换为多租户应用程序。
我想要的概念是重用我拥有的实际 JSP 并根据我根据 URL 的路径确定的配置更改它们的内容。

示例:
客户 #1 (abc) - URL: http: //mydomain.com/abc/login.html
客户 #2 (xyz) - URL: http: //mydomain.com/xyz/login.html

因此,“租户”的名称是页面路径的前缀。

我修改我的控制器是这样的:

@Controller
@RequestMapping("/{customer:[a-zA-Z0-9]+}/login.htm")
public class LoginController 
{
    private static final Logger logger = Logger.getLogger(LoginController.class);

    @RequestMapping
    @ReadOnlyRequest
    public String login(@PathVariable("customer") String customer, HttpServletRequest request) 
    {
        // Do some 'customer' related actions here

        return "login"; // Map to the 'login.jsp' view
    }
}

我的视图解析器配置是:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
   <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
   <property name="prefix" value="/WEB-INF/jsp/" />
   <property name="suffix" value=".jsp" />
</bean>

到目前为止,我有以下form-login配置:

<form-login 
   login-page="/login.htm"
   authentication-failure-url="/login.htm?error=true"
   login-processing-url="/login_process"
   default-target-url="/index.jsp"
   always-use-default-target="true"
/>

但我不知道如何转换它以支持我的更改。

有没有办法将其转换为:

<form-login 
  login-page="/${customer}/login.htm"
  authentication-failure-url="/${customer}/login.htm?error=true"
  login-processing-url="/${customer}/login_process"
  default-target-url="/index.jsp"
  always-use-default-target="true"
/>
4

1 回答 1

2

一种可能的想法是使用 URL 重写而不是手动处理租户标识符。通过这种方式,您可以将租户处理逻辑与您的代码完全解耦,例如,如下所示:

  • 您定义一个入站重写规则,该规则将租户标识符转换为请求属性并将其保存为请求属性/abc/login.html/login.html

  • 您定义一个出站规则,将当前租户标识符附加到正在写入响应的 URL。我认为 Spring Security 在发送重定向时应该尊重这样的规则(如果没有,你可以定义一个 custom RedirectStrategy)。

虽然我没有测试过这个想法,也不能确定它会起作用。

也可以看看:

于 2012-09-11T12:49:57.307 回答