1

Spring Securityandを使用して小さくてシンプルな 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

考えられる 1 つのアイデアは、テナント ID を手動で処理する代わりに、URL の書き換えを使用することです。このようにして、たとえば次のように、テナント処理ロジックをコードから完全に切り離すことができます。

  • テナント識別子に変換/abc/login.htmlしてリクエスト属性として保存するインバウンド書き換えルールを定義します。/login.html

  • 応答に書き込まれる URL に現在のテナント ID を追加するアウトバウンド ルールを定義します。Spring Security は、リダイレクトを送信するときにそのようなルールを尊重する必要があると思います (そうでない場合は、カスタムを定義できますRedirectStrategy)。

私はこのアイデアをテストしていませんが、うまくいくかどうかはわかりません.

以下も参照してください。

于 2012-09-11T12:49:57.307 に答える