トップタグライブラリで導入:
<%@ taglibの接頭辞= "セキュリティ" URIは= "http://www.springframework.org/security/tags" %>
別のユーザーの顔での追加異なるデータを表示するには許可が必要です:
< セキュリティ:AUTHORIZEのアクセス= "hasAnyRole( 'ROLE_PRODUCT'、 'ROLE_ADMIN')" > < 李ID = "システム設定" > < A HREF = "$ {pageContext.request.contextPath} /製品/のfindAll" > < 私クラス= "FA FA-円O" > </ I > 产品管理 </ A > </ 李> </ セキュリティ:AUTHORIZE > < セキュリティ:AUTHORIZEのアクセス= "hasAnyRole( 'ROLE_ORDER'、 'ROLE_ADMIN')"> < 李ID =「システム設定」> < A HREF = "$ {pageContext.request.contextPath} /順序/のfindAll" > < I クラス= "FA FA-円O" > </ I > 订单管理 </ A > </ 李> </ セキュリティ:AUTHORIZE >
そのデータアクセスが彼の範囲内ではありませんので、上記の操作後、単に異なるユーザー権限のための異なるボタンが表示され、実際には、アクセス権を制御していない、ユーザーは、手動でアドレスバーに入力することにより、アドレスにアクセスする必要があるかもしれません
概要:ページショーだけでユーザーエクスペリエンスのための動的メニュー、本当に権限を制御できません!
動作することを許可:
SpringSecurityは、コメントの仕方によって、クラスやメソッドへのアクセスを制御することができます。、対応するアノテーションサポートを開く必要があり、コントローラクラスのノートは、対応するアノテーションサポートMVC構成ファイルを配置する必要がある場合、コントローラは、(走査し、作成クラスMVCの設定ファイルであるため、サブコンテナ)。同様に、場合の注意事項サービスクラスは、対応するアノテーション支持バネ(ApplicationContextの又はバネセキュリティ【内に配置されるべき親コンテナ])プロファイル、類似及びスプリング宣言トランザクション制御です。サービスクラスに関する提言、親コンテナは、比較的安全に、訪問HTTPリクエストのみ子コンテナへのHTTPリクエストのアクセスではないので、その後、サブコンテナのアクセスによって、親コンテナ注:親がサブコンテナ船にアクセスすることはできません
オープン承認注釈のサポート:ここ3つのノートを実証したが、クラスでの実際の開発は、することができます!
! - < オープンはサポートアクセス制御コメント SpringSecurity制御スイッチ内部の注釈特権:確保-注釈 前後注釈を:注釈権限スプリングが制御スイッチ指定された オープンjsr250-APIの注釈、必要性のjsr250-API:jsr250-注釈をジャーパッケージ- > < セキュリティ:セキュリティ・グローバル・メソッド 担保-注釈= "有効" プリPOST-注釈= "有効" JSR250-注釈= "有効" />
jsr250-APIサポート
< 依存性> < のgroupId > javax.annotation </ のgroupId > < たartifactId > jsr250-API </ たartifactId > < バージョン> 1.0 </ バージョン> </ 依存>
注釈のサポート対応するクラスやメソッドに注釈を追加します。
@Controller // @Secured({ "ROLE_PRODUCT"、 "ROLE_ADMIN"})// 内部SpringSecurity製造注釈 // @RolesAllowed({ "ROLE_PRODUCT"、 "ROLE_ADMIN"})// JSR250アノテーション @PreAuthorize(「hasAnyRole( ' ROLE_PRODUCT '' ROLE_ADMIN「) ")// エルの春の注釈表現 @RequestMapping(" /製品" ) のパブリック クラスProductControllerは{ (@RequestMapping " /のfindAll " ) のパブリック文字列のfindAll(){ リターン "製品一覧」。 } }
@Controller @RequestMapping( "/注文" ) パブリック クラスOrderController { @Secured({ "ROLE_ORDER"、 "ROLE_ADMIN" }) @RequestMapping( "/のfindAll" ) パブリック文字列のfindAll(){ 戻り "順序リスト" 。 } }
取り扱い権限不足例外:各機関が不足しているが、本当に恥ずかしい、403ページが登場しました!
方法1:春のsecurity.xml構成ファイル内のプロセス(403ののみ異常を扱うことができ、他の異常は処理できません)
< セキュリティ:HTTP オートコンフィグ= "true"を使用-表現= "真" > <! - 省略其它配置- > <! - 处理403异常- > < セキュリティ:アクセス拒否ハンドラのエラーページ= "/ 403.jsp" /> </ セキュリティ:HTTP >
第二の方法:web.xmlに処理
< エラーページ> < エラーコード> 403 </ エラーコード> < 場所> /403.jsp </ 場所> </ エラーページ>
< エラーページ> < エラーコード> 404 </ エラーコード> < 場所> /404.jsp </ 場所> </ エラーページ>
三つの方法:書き込み例外ハンドラ(推奨)
伝統的な方法をspringmvc:
@Component パブリック クラス HandlerControllerException 実装HandlerExceptionResolver { @Override 公共のModelAndView resolveException(HttpServletRequestのHttpServletRequestを、HttpServletResponseのHttpServletResponseの、物体O、例外e){ のModelAndView MV = 新規のModelAndView()。 もし(E instanceofのAccessDeniedException){ (mv.setViewName ":/403.jspリダイレクトします" )。 } 他{ mv.setViewName( "リダイレクト:/500.jsp" )。 } 戻りMV。 } }
簡単な方法:
@ControllerAdvice パブリック クラスHandlerControllerAdvice { // 只有出现AccessDeniedException异常才跳转403.jsp页面 @ExceptionHandler(AccessDeniedException。クラス) パブリック文字列handlerException(){ 戻り "リダイレクト:/403.jsp" 。 } @ExceptionHandler(のRuntimeException クラス) パブリック文字列runtimeHandlerException(){ 戻り "リダイレクト:/500.jsp" 。 } @ExceptionHandler(例外。クラス) 公衆のModelAndView customException(例外e){ ModelAndView MV = 新しいのModelAndView(); mv.addObject( "メッセージ" 、e.getMessage())。 mv.setViewName( "エラー" ); リターンMV。 } }
この方法では、直接上記の最後のコードとすることができるように、このクラスでは、この方法は、...ヌルポインタの異なる異常そのような特殊処理方法、特殊処理方法の配列の範囲に対応する異なる複数の方法を定義することができます情報のすべての異常処理。
治療の@ExceptionHandler注釈タイプは、アレイに結合した例外は、この方法に来ない、NullPointerExceptionが指定がある場合、すなわち、異常を示すために使用されます。