SpringMVC学習シリーズ(9) アノテーションによる権限検証を実装するコードの詳細解説

黄舟
リリース: 2017-03-03 11:07:03
オリジナル
2058 人が閲覧しました

ほとんどのシステムでは、さまざまなユーザーがどのコンテンツを閲覧できるかを決定するために権限管理が必要です。では、Spring MVC で権限の検証を実装するにはどうすればよいでしょうか。もちろん、これを達成するために、サーブレット内でフィルター Filter を引き続き使用することもできます。しかし、Spring MVC のアクション インターセプターの助けを借りて、アノテーション ベースの権限検証を実装できます。

1. まずアクションインターセプターを紹介します:

HandlerInterceptor は、独自の処理ロジックを実装できるように Spring MVC によって提供されるインターセプター インターフェイスです。インターフェースには 3 つのメソッドがあり、その意味は次のとおりです:

preHandle: アクション内の処理ロジックを実行する前に実行され、true を返すと、postHandle が実行され、false を返すと、afterCompletion が実行されます。実行は中断されます。

postHandle: アクション内のロジックを実行した後、ビューに戻る前に実行されます。

afterCompletion: アクションがビューに戻った後に実行されます。 HandlerInterceptorAdapter アダプターは、HandlerInterceptor の使用を容易にするための Spring MVC の HandlerInterceptor のデフォルト実装です。preHandle メソッドは直接 true を返すため、HandlerInterceptorAdapter を継承した後は、この 3 つを実装するだけで済みます。必要なメソッド、HandlerInterceptor を継承する代わりに、必要かどうかに関係なく、3 つのメソッドをすべて実装する必要があります。

もちろん、HandlerInterceptor の助けを借りて、ロギング、リクエスト処理時間の分析など、他の多くの機能を実装できます。パーミッションの検証はそのうちの 1 つにすぎません。

SpringMVC学習シリーズ(9) アノテーションによる権限検証を実装するコードの詳細解説. 注釈許可検証機能を段階的に完了してみましょう。

まずアカウントコントローラーを追加し、権限がない場合にログインページへのジャンプをシミュレートするためのアクションとビューを追加します。 内容は次のとおりです: com.demo.web.controllers パッケージ内の

AccountController.java:

public interface HandlerInterceptor {  
    boolean preHandle(  
            HttpServletRequest request, HttpServletResponse response,   
            Object handler)   
            throws Exception;  
  
    void postHandle(  
            HttpServletRequest request, HttpServletResponse response,   
            Object handler, ModelAndView modelAndView)   
            throws Exception;  
  
    void afterCompletion(  
            HttpServletRequest request, HttpServletResponse response,   
            Object handler, Exception ex)  
            throws Exception;  
}
ログイン後にコピー

views フォルダーの下にあるlogin.jspを表示します:

package com.demo.web.controllers;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping(value = "/account")public class AccountController {
    
    @RequestMapping(value="/login", method = {RequestMethod.GET})    public String login(){        
        return "login";
    }
    
}
ログイン後にコピー


新しいパッケージcom.demo.web.auth、カスタムアノテーションAuthPassportを追加します。内容は次のとおりです:

nbsp;html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><meta><title>Insert title here</title>
    这里是登录界面
ログイン後にコピー


独自のインターセプターを追加しますAuthInterceptorを実装 HandlerInterceptorAdapterから継承した内容は以下の通りです:

package com.demo.web.auth;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Inherited;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;

@Documented
@Inherited
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)public @interface AuthPassport {    boolean validate() default true;
}
ログイン後にコピー

設定プロジェクトのspringservlet-config.xmlに以下の内容を追加します:

package com.demo.web.auth;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.web.method.HandlerMethod;import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;public class AuthInterceptor extends HandlerInterceptorAdapter {
    
    @Override    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {        
        if(handler.getClass().isAssignableFrom(HandlerMethod.class)){
            AuthPassport authPassport = ((HandlerMethod) handler).getMethodAnnotation(AuthPassport.class);            
            //没有声明需要权限,或者声明不验证权限
                if(authPassport == null || authPassport.validate() == false)                return true;            else{                
                //在这里实现自己的权限验证逻辑
                if(false)//如果验证成功返回true(这里直接写false来模拟验证失败的处理)
                    return true;                else//如果验证失败                {                    //返回到登录界面
                    response.sendRedirect("account/login");                    return false;
                }       
            }
        }        else
            return true;   
     }
}
ログイン後にコピー


このようにして、各アクションメソッドの実行時にAuthInterceptorの処理が呼び出されます。定義したAuthPassportアノテーションがアクション上にあると判断された場合、内部の権限検証ロジックが実行されます。

プロジェクトを実行します:

springservlet-config.xmlで定義したHelloworldControllerのindexメソッドが実行されていることがわかります。

りー

下面我们在HelloworldController的index方法上加上自定义注解AuthPassport:

@AuthPassport
@RequestMapping(value={"/index","/hello"})public ModelAndView index(){
    
    ModelAndView modelAndView = new ModelAndView();  
    modelAndView.addObject("message", "Hello World!");  
    modelAndView.setViewName("index");  
    return modelAndView;
}
ログイン後にコピー


重新运行项目:

SpringMVC学習シリーズ(9) アノテーションによる権限検証を実装するコードの詳細解説

可以看到正确执行了权限判断逻辑,这样我们只需要在我们在需要权限验证的action上加上这个注解就可以实现权限控制功能了。

 

注解式权限验证的内容到此结束。

 以上就是SpringMVC学习系列(9) 之 实现注解式权限验证的代码详解的内容,更多相关内容请关注PHP中文网(www.php.cn)!


ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート