ほとんどのシステムでは、さまざまなユーザーがどのコンテンツを閲覧できるかを決定するために権限管理が必要です。では、Spring MVC で権限の検証を実装するにはどうすればよいでしょうか。もちろん、これを達成するために、サーブレット内でフィルター Filter を引き続き使用することもできます。しかし、Spring MVC のアクション インターセプターの助けを借りて、アノテーション ベースの権限検証を実装できます。
1. まずアクションインターセプターを紹介します:
HandlerInterceptor は、独自の処理ロジックを実装できるように Spring MVC によって提供されるインターセプター インターフェイスです。インターフェースには 3 つのメソッドがあり、その意味は次のとおりです:
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"; } }
nbsp;html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><meta><title>Insert title here</title> 这里是登录界面
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; }
重新运行项目:
可以看到正确执行了权限判断逻辑,这样我们只需要在我们在需要权限验证的action上加上这个注解就可以实现权限控制功能了。
注解式权限验证的内容到此结束。
以上就是SpringMVC学习系列(9) 之 实现注解式权限验证的代码详解的内容,更多相关内容请关注PHP中文网(www.php.cn)!