国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
我的shiro之旅: 四 自定義filter

上一篇文章對shiro的filter作了一些簡單的介紹,接一下寫寫息自定義shiro的filter。使用shiro的時候,比較常用的filter有anon,authc,roles和perms。當我們想定義某個鏈接是擁有某些權限的用戶才可以訪問的時候,我們可以這樣定義。/xx = roles[A,B]。在shiro中,表示當前用戶同時擁有A,B兩種角色才可以訪問/xx這個鏈接,是一種&&(與)的關系,我們可以看看源碼。在shiro-web-xx.jar的org.apache.shiro.web.filter.authz包下有RolesAuthorizationFilter這樣一個類,這個類就是定義roles的filter。

  1. public class RolesAuthorizationFilter extends AuthorizationFilter {  
  2.   
  3.     //TODO - complete JavaDoc  
  4.   
  5.     @SuppressWarnings({"unchecked"})  
  6.     public boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws IOException {  
  7.   
  8.         Subject subject = getSubject(request, response);  
  9.         String[] rolesArray = (String[]) mappedValue;  
  10.   
  11.         if (rolesArray == null || rolesArray.length == 0) {  
  12.             //no roles specified, so nothing to check - allow access.  
  13.             return true;  
  14.         }  
  15.   
  16.         Set<String> roles = CollectionUtils.asSet(rolesArray);  
  17.         return subject.hasAllRoles(roles);  
  18.     }  
  19.   
  20. }  

上面定義了subject.hasAllRoles(roles);就是當前用戶必須擁有定義的所有角色才會返回true。但有時候,我們需要當前用戶擁有定義的其他一個角色就可以訪問,那就需要寫自己的filter。也很簡單,代碼以下:

  1. public class AnyRolesAuthorizationFilter extends AuthorizationFilter {  
  2.   
  3.       
  4.     @Override  
  5.     protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {  
  6.   
  7.         Subject subject = getSubject(request, response);  
  8.         String[] rolesArray = (String[]) mappedValue;  
  9.   
  10.         if (rolesArray == null || rolesArray.length == 0) {  
  11.             // no roles specified, so nothing to check - allow access.  
  12.             return true;  
  13.         }  
  14.   
  15.         Set<String> roles = CollectionUtils.asSet(rolesArray);  
  16.         for (String role : roles) {  
  17.             if (subject.hasRole(role)) {  
  18.                 return true;  
  19.             }  
  20.         }  
  21.         return false;  
  22.     }  
  23.   
  24. }  

從上面的代碼可以看到,當遍歷,發(fā)現(xiàn)當前用戶擁有定義的其中一個角色就立刻返回true,否則返回false。

定義好filter,只需要代碼默認的roles即可。

  1. <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">  
  2.         <property name="securityManager" ref="securityManager" />  
  3.         <property name="loginUrl" value="/security/login.html" />  
  4.         <property name="successUrl" value="/home.html" />  
  5.         <property name="unauthorizedUrl" value="/security/unauthorized.html" />  
  6.         <property name="filters">  
  7.             <map>  
  8.                 <entry key="anyRoles" value-ref="anyRolesAuthorizationFilter" />  
  9.             </map>  
  10.         </property>  
  11.         <property name="filterChainDefinitions">  
  12.             <value>  
  13.                                 /admin = anyRoles[admin1,admin2]  
  14.                 /** = anon  
  15.             </value>  
  16.         </property>  
  17.     </bean>  
perms的filter也同理??纯丛创a:

  1. public class PermissionsAuthorizationFilter extends AuthorizationFilter {  
  2.   
  3.     //TODO - complete JavaDoc  
  4.   
  5.     public boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws IOException {  
  6.   
  7.         Subject subject = getSubject(request, response);  
  8.         String[] perms = (String[]) mappedValue;  
  9.   
  10.         boolean isPermitted = true;  
  11.         if (perms != null && perms.length > 0) {  
  12.             if (perms.length == 1) {  
  13.                 if (!subject.isPermitted(perms[0])) {  
  14.                     isPermitted = false;  
  15.                 }  
  16.             } else {  
  17.                 if (!subject.isPermittedAll(perms)) {  
  18.                     isPermitted = false;  
  19.                 }  
  20.             }  
  21.         }  
  22.   
  23.         return isPermitted;  
  24.     }  
  25. }  

自定義的filter:

  1. public class AnyPermissionsAuthorizationFilter extends AuthorizationFilter {  
  2.   
  3.     @Override  
  4.     protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {  
  5.         Subject subject = getSubject(request, response);  
  6.         String[] perms = (String[]) mappedValue;  
  7.   
  8.         for (String perm : perms) {  
  9.             if (subject.isPermitted(perm)) {  
  10.                 return true;  
  11.             }  
  12.         }  
  13.           
  14.         return false;  
  15.     }  
  16.   
  17. }  

配置使用自定義filter

  1. <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">  
  2.         <property name="securityManager" ref="securityManager" />  
  3.         <property name="loginUrl" value="/security/login.html" />  
  4.         <property name="successUrl" value="/home.html" />  
  5.         <property name="unauthorizedUrl" value="/security/unauthorized.html" />  
  6.         <property name="filters">  
  7.             <map>  
  8.                 <entry key="anyPerms" value-ref="anyPermissionsAuthorizationFilter" />  
  9.             </map>  
  10.         </property>  
  11.           
  12.             <value>  
  13.                 /admin/add = anyPerms["admin:delete","admin:add"]  
  14.                 /** = anon  
  15.             </value>  
  16.         </property>  
  17.     </bean>  

當用戶請求/admin/add時,就會調(diào)用自定義的AnyPermissionsAuthorizationFilter來執(zhí)行。

shiro的filter大概講到這里,相信讀者對shiro的filter有更深的認識。

本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
第八章 攔截器機制
SELinux機制及在項目開發(fā)中的應用
apache
shrio 權限管理filterChainDefinitions過濾器配置
Apache Shiro實現(xiàn)單點登錄SSO | 沐風
一篇看懂shiro安全框架
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服