2

Spring MVC、Spring Security、および Apache Tiles を使用していますが、次の問題があります。

認証されていないユーザーが自分の Web サイト(つまり) のホーム URL にアクセスwww.mywebsite.com/して、そこから認証できるようにログイン フォームが表示されるようにしたいと考えています。

次に、ユーザーが認証されると、おそらく別のテンプレート/jspを使用して、WebサイトのホームURLに完全に異なるページコンテンツを表示したいと思います.www.mywebsite.com/

私が達成しようとしているのは、基本的に、ユーザーが認証されているかどうかに基づいて、同じ URL に対して異なるコンテンツを表示できるようにすることです。これはすべて、Spring セキュリティと Spring MVC を使用しています。

Spring Security を調査しましたが、上記の問題の解決策を見つけることができませんでした。他の人も同様の問題に遭遇しました ( Spring セキュリティ - ユーザーロールに基づいて異なるコンテンツを配信する同じページを参照)

これを実装する方法について、誰でもポインタやアドバイスを提供できますか?

4

5 に答える 5

3

私が考えることができる 1 つの解決策は、リクエストからユーザー プリンシパルを MVC コントローラーにチェックインし、認証されているか、1 つの ModelAndView を返すロールを持っている場合、それ以外の場合は別のロールを返すことです。

@Controller
public class MyController{

    public ModelAndView doSomething(HttpServletRequest request, HttpServletResponse response){
        if(request.getUserPrincipal() != null && request.isUserInRole("someRole"){
            return new ModelAndView("view1");
        } 
        else {
            return new ModelAndView("view2");
        }
    }

}
于 2012-09-26T11:41:39.027 に答える
2

Spring フォーラムのメンバーから、素敵でエレガントなソリューションが提供されました。ここにあります:

@RequestMapping("/")
@PreAuthorize("isAuthenticated()")
public String authenticatedHomePage() {
    return "authenticatedHomePage";
}

@RequestMapping("/")
public String homePage() {
    return "homePage";
}

Spring Security に依存しているため、非常に優れています。こちらをご覧ください(ブログ投稿

于 2012-09-26T17:08:13.193 に答える
1

あなたが望むものを達成するためのいくつかの方法を考えることができます。

まず、Spring Security の taglib を使用して、ユーザーが正しく認証されているかどうかに応じて、View テンプレートのコンテンツを条件付きでレンダリングできます。Spring Security taglib の詳細については、こちらを参照してください。大雑把に言えば、これにより View テンプレートは次のようになります。

if(user is authenticated)
     render content for authenticated user
else
     render log-in form

ただし、ユーザーが正しく認証されたかどうかに関係なく、コントローラーは常にモデルを作成しているため、少し鈍いように感じます。また、ログイン フォームを表示する場合は常に、View テンプレートでこのロジックが必要になります。

別のアプローチは、ユーザーが完全に認証されるまで、ログイン ページのレンダリングを担当するコントローラーにすべての要求を転送するHandlerInterceptor実装を作成することです。これを行うには、HandlerInterceptor の preHandle() メソッドを使用できます。

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class MyHandlerInterceptor implements HandlerInterceptor
{

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
{
    SecurityContext sc = SecurityContextHolder.getContext();
    boolean userAuthenticated = true;
    /* Some logic in here to determine if the user is correctly authenticated */

    if(!userAuthenticated)
    {
        request.getRequestDispatcher("/login").forward(request, response);
        return false;
    }

    return true;
}

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception
{

}

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception
{

}}

次に、この機能が必要な URL に HandlerInterceptor 実装をマップするように Spring MVC を構成できます。これにより、すべてのコントローラーでロジックを複製する必要がなくなり、簡単にテストできます。

于 2013-06-25T17:10:10.860 に答える
0

あなたは使用しようとすることができます

<security:authorize access=”isAnonymous()”&gt;
not authenticated page
</security:authorize>
<security:authorize access=”isAuthenticated()”&gt;
authenticated page
</security:authorize>

または、コントローラーでビュー名として「redirect: page_for_not_auth」を返し、認証されていない要求を処理する別のコントローラー/メソッドに応答をリダイレクトできます。

于 2012-09-26T12:55:44.977 に答える