摘要:自定義注解順序創建自定義的注解資源管理器,繼承,添加新注解支持攔截器,繼承方法攔截器,繼承權限處理器,繼承,校驗權限一自定義注解二權限處理器自定義權限處理器多個權限,有一個就通過三方法攔截器自定義注解的方法攔截器驗證權限四切面攔截器自定義注
自定義Shiro注解 順序
創建自定義的注解
資源管理器,繼承AuthorizationAttributeSourceAdvisor,添加新注解支持
AOP攔截器,繼承AopAllianceAnnotationsAuthorizingMethodInterceptor
方法攔截器,繼承AuthorizingAnnotationMethodInterceptor
權限處理器,繼承AuthorizingAnnotationHandler,校驗權限
一、自定義注解@Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface Permissions { String[] value(); }二、權限處理器
import org.apache.shiro.authz.AuthorizationException; import org.apache.shiro.authz.aop.AuthorizingAnnotationHandler; import org.apache.shiro.subject.Subject; import java.lang.annotation.Annotation; /** * 自定義權限處理器 * @author BBF */ public class PermissionHandler extends AuthorizingAnnotationHandler { public PermissionHandler() { super(Permissions.class); } @Override public void assertAuthorized(Annotation a) throws AuthorizationException { if (a instanceof Permissions) { Permissions annotation = (Permissions) a; String[] perms = annotation.value(); Subject subject = getSubject(); if (perms.length == 1) { subject.checkPermission(perms[0]); return; } // 多個權限,有一個就通過 boolean hasAtLeastOnePermission = false; for (String permission : perms) { if (subject.isPermitted(permission)) { hasAtLeastOnePermission = true; break; } } // Cause the exception if none of the role match, // note that the exception message will be a bit misleading if (!hasAtLeastOnePermission) { subject.checkPermission(perms[0]); } } } }三、方法攔截器
import org.apache.shiro.aop.AnnotationResolver; import org.apache.shiro.aop.MethodInvocation; import org.apache.shiro.authz.AuthorizationException; import org.apache.shiro.authz.aop.AuthorizingAnnotationMethodInterceptor; /** * 自定義注解的方法攔截器 * @author BBF */ public class PermissionMethodInterceptor extends AuthorizingAnnotationMethodInterceptor { public PermissionMethodInterceptor() { super(new PermissionHandler()); } public PermissionMethodInterceptor(AnnotationResolver resolver) { super(new PermissionHandler(), resolver); } @Override public void assertAuthorized(MethodInvocation mi) throws AuthorizationException { // 驗證權限 try { ((PermissionHandler) getHandler()).assertAuthorized(getAnnotation(mi)); } catch (AuthorizationException ae) { // Annotation handler doesn"t know why it was called, so add the information here if possible. // Don"t wrap the exception here since we don"t want to mask the specific exception, such as // UnauthenticatedException etc. if (ae.getCause() == null) { ae.initCause(new AuthorizationException("Not authorized to invoke method: " + mi.getMethod())); } throw ae; } } }四、切面攔截器
import org.apache.shiro.spring.aop.SpringAnnotationResolver; import org.apache.shiro.spring.security.interceptor.AopAllianceAnnotationsAuthorizingMethodInterceptor; /** * 自定義注解的AOP攔截器 * @author BBF */ public class PermissionAopInterceptor extends AopAllianceAnnotationsAuthorizingMethodInterceptor { public PermissionAopInterceptor() { super(); // 添加自定義的注解攔截器 this.methodInterceptors.add(new PermissionMethodInterceptor(new SpringAnnotationResolver())); } }五、注解攔截器
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor; import org.springframework.core.annotation.AnnotationUtils; import java.lang.reflect.Method; /** * 自定義的Shiro注解攔截器 * @author BBF */ public class ShiroAdvisor extends AuthorizationAttributeSourceAdvisor { /** * Create a new AuthorizationAttributeSourceAdvisor. */ public ShiroAdvisor() { // 這里可以添加多個 setAdvice(new PermissionAopInterceptor()); } @SuppressWarnings({"unchecked"}) @Override public boolean matches(Method method, Class targetClass) { Method m = method; if (targetClass != null) { try { m = targetClass.getMethod(m.getName(), m.getParameterTypes()); return this.isFrameAnnotation(m); } catch (NoSuchMethodException ignored) { //default return value is false. If we can"t find the method, then obviously //there is no annotation, so just use the default return value. } } return super.matches(method, targetClass); } private boolean isFrameAnnotation(Method method) { return null != AnnotationUtils.findAnnotation(method, Permissions.class); } }六、配置shiro
替換AuthorizationAttributeSourceAdvisor 為 ShiroAdvisor
/** * 啟用注解攔截方式 * @return AuthorizationAttributeSourceAdvisor */ @Bean public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor() { AuthorizationAttributeSourceAdvisor advisor = new ShiroAdvisor(); advisor.setSecurityManager(securityManager()); return advisor; }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69190.html
摘要:的自身注解的用法。所以自定義注解的作用很廣。但是在這里,我僅僅基于的來實現適用于它的自定義注解。其他的自定義的注解的編寫思路和這個也是類似的。 基于shiro的自定義注解的擴展 根據我的上一篇文章,權限設計的雜談中,涉及到了有關于前后端分離中,頁面和api接口斷開表與表層面的關聯,另辟蹊徑從其他角度找到方式進行關聯。這里我們主要采取了shiro的自定義注解的方案。本篇文章主要解決以下的...
摘要:為了達到很好的效果,我們使用來對的緩存進行管理配置會話管理器,對會話時間進行控制手動清空緩存由于驗證用戶名和密碼之前,一般需要驗證驗證碼的。 前言 本文主要講解的知識點有以下: Shiro授權過濾器使用 Shiro緩存 與Ehcache整合 Shiro應用->實現驗證碼功能 記住我功能 一、授權過濾器測試 我們的授權過濾器使用的是permissionsAuthorization...
摘要:寫在前面在一款應用的整個生命周期,我們都會談及該應用的數據安全問題。用戶的合法性與數據的可見性是數據安全中非常重要的一部分。 寫在前面 在一款應用的整個生命周期,我們都會談及該應用的數據安全問題。用戶的合法性與數據的可見性是數據安全中非常重要的一部分。但是,一方面,不同的應用對于數據的合法性和可見性要求的維度與粒度都有所區別;另一方面,以當前微服務、多服務的架構方式,如何共享Sessi...
摘要:框架提供的接口,是的核心,代表安全管理器對象。可以開發人員編寫,框架也提供一些。在中作為應用程序和安全數據之間的橋梁或連接器。例如要求中必須同時含有和的權限才能執行方法。 apache shiro框架簡介 Apache Shiro是一個強大而靈活的開源安全框架,它能夠干凈利落地處理身份認證,授權,企業會話管理和加密。現在,使用Apache Shiro的人越來越多,因為它相當簡單,相比比Sp...
閱讀 3801·2021-11-24 09:39
閱讀 1810·2021-11-02 14:41
閱讀 814·2019-08-30 15:53
閱讀 3480·2019-08-29 12:43
閱讀 1189·2019-08-29 12:31
閱讀 3087·2019-08-26 13:50
閱讀 795·2019-08-26 13:45
閱讀 986·2019-08-26 10:56