From dca4e1544e90768d8237d0440d99b6d00906540a Mon Sep 17 00:00:00 2001 From: felixu Date: Mon, 25 Mar 2019 20:04:59 +0800 Subject: [PATCH] review --- .../com/slife/config/shiro/ShiroConfig.java | 201 +++++++++--------- .../config/plus/SysMetaObjectHandler.java | 28 +-- 2 files changed, 115 insertions(+), 114 deletions(-) diff --git a/slife-sys/src/main/java/com/slife/config/shiro/ShiroConfig.java b/slife-sys/src/main/java/com/slife/config/shiro/ShiroConfig.java index 44bfcd9..1920ab4 100644 --- a/slife-sys/src/main/java/com/slife/config/shiro/ShiroConfig.java +++ b/slife-sys/src/main/java/com/slife/config/shiro/ShiroConfig.java @@ -1,13 +1,5 @@ package com.slife.config.shiro; -/** - * Created by chen on 2017/7/14. - *

- * Email 122741482@qq.com - *

- * Describe: - */ - import lombok.extern.slf4j.Slf4j; import org.apache.shiro.cache.CacheManager; import org.apache.shiro.mgt.SecurityManager; @@ -19,7 +11,6 @@ import org.apache.shiro.spring.web.ShiroFilterFactoryBean; import org.apache.shiro.web.mgt.CookieRememberMeManager; import org.apache.shiro.web.mgt.DefaultWebSecurityManager; import org.apache.shiro.web.servlet.SimpleCookie; -import org.slf4j.Logger; import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; @@ -28,18 +19,25 @@ import org.springframework.web.filter.DelegatingFilterProxy; import javax.servlet.DispatcherType; import java.util.EnumSet; import java.util.LinkedHashMap; +import java.util.Map; /** * shiro的配置类 - * @author Administrator * + * @author jamen + * @author felixu + * @date 2017.7.14 */ @Slf4j @Configuration public class ShiroConfig { - private Logger logger = org.slf4j.LoggerFactory.getLogger(getClass()); - + /** + * 为了填Spring Boot升级到2.x之后,整合Shiro的一个大坑 + * 在2.x中Forward之后ShiroFilter重新被加载 + * + * @return FilterRegistrationBean + */ @Bean public FilterRegistrationBean delegatingFilterProxy(){ FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean<>(); @@ -55,65 +53,78 @@ public class ShiroConfig { return filterRegistrationBean; } - @Bean - public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) { - //SecurityManager manager= securityManager(authRealm); - ShiroFilterFactoryBean bean=new ShiroFilterFactoryBean(); + /** + * 核心过滤器 + * + * @param securityManager SessionsSecurityManager + * @return ShiroFilter + */ + @Bean + public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) { + ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean(); bean.setSecurityManager(securityManager); - //配置登录的url和登录成功的url + + // 配置登陆url bean.setLoginUrl("/login"); + // 配置登陆成功url bean.setSuccessUrl("/index"); - //配置访问权限 - LinkedHashMap filterChainDefinitionMap=new LinkedHashMap<>(); - filterChainDefinitionMap.put("/logout","logout"); - - - //开放的静态资源 - filterChainDefinitionMap.put("/favicon.ico", "anon");//网站图标 - filterChainDefinitionMap.put("/css/**","anon"); - filterChainDefinitionMap.put("/js/**","anon"); - filterChainDefinitionMap.put("/img/**","anon"); - filterChainDefinitionMap.put("/fonts/**","anon"); - - filterChainDefinitionMap.put("/health/**","anon"); - filterChainDefinitionMap.put("/env/**","anon"); - filterChainDefinitionMap.put("/metrics/**","anon"); - filterChainDefinitionMap.put("/trace/**","anon"); - filterChainDefinitionMap.put("/dump/**","anon"); - filterChainDefinitionMap.put("/jolokia/**","anon"); - filterChainDefinitionMap.put("/info/**","anon"); - filterChainDefinitionMap.put("/logfile/**","anon"); - filterChainDefinitionMap.put("/refresh/**","anon"); - filterChainDefinitionMap.put("/flyway/**","anon"); - filterChainDefinitionMap.put("/liquibase/**","anon"); - filterChainDefinitionMap.put("/heapdump/**","anon"); - filterChainDefinitionMap.put("/loggers/**","anon"); - filterChainDefinitionMap.put("/auditevents/**","anon"); - - - filterChainDefinitionMap.put("/layouts/**","anon"); - filterChainDefinitionMap.put("/attach/**","anon"); - - - filterChainDefinitionMap.put("/*", "authc");//表示需要认证才可以访问 - filterChainDefinitionMap.put("/**", "authc");//表示需要认证才可以访问 - filterChainDefinitionMap.put("/*.*", "authc"); - bean.setFilterChainDefinitionMap(filterChainDefinitionMap); + // 配置访问权限 + bean.setFilterChainDefinitionMap(fillFilterChainDefinitionMap()); return bean; + } + + /** + * url拦截器配置填充 + * + * @return FilterChainDefinitionMap + */ + private Map fillFilterChainDefinitionMap() { + return new LinkedHashMap() {{ + // 登出,可自定义,做些自定义操作 + put("/logout","logout"); + + // 不需要权限 + put("/favicon.ico", "anon"); + put("/css/**","anon"); + put("/js/**","anon"); + put("/img/**","anon"); + put("/fonts/**","anon"); + put("/health/**","anon"); + put("/env/**","anon"); + put("/metrics/**","anon"); + put("/trace/**","anon"); + put("/dump/**","anon"); + put("/jolokia/**","anon"); + put("/info/**","anon"); + put("/logfile/**","anon"); + put("/refresh/**","anon"); + put("/flyway/**","anon"); + put("/liquibase/**","anon"); + put("/heapdump/**","anon"); + put("/loggers/**","anon"); + put("/auditevents/**","anon"); + put("/layouts/**","anon"); + put("/attach/**","anon"); + + // 需要权限 + put("/*", "authc"); + put("/**", "authc"); + put("/*.*", "authc"); + }}; } - // TODO: 2019-03-14 可配置的cache -// /** -// * 创建自定义的AuthorizingRealm -// * 关于缓存可以选择使用Ehcache或者Redis -// * {@link org.apache.shiro.cache.ehcache.EhCacheManager} -// * {@link RedisCacheManager} -// * {@link CacheConfig} -// * -// * @param cacheManager 这里注入接口,在yaml文件中配置具体使用Ehcache还是Redis. {@link CacheConfig} -// * @return AuthorizingRealm -// */ + + /** + * 创建自定义的AuthorizingRealm + * 关于缓存可以选择使用Ehcache或者Redis + * {@link org.apache.shiro.cache.ehcache.EhCacheManager} + * {@link RedisCacheManager} + * {@link CacheConfig} + * + * @param cacheManager 这里注入接口,在yaml文件中配置具体使用Ehcache还是Redis. + * @return AuthorizingRealm + */ @Bean public AuthorizingRealm authorizingRealm(CacheManager cacheManager) { AuthRealm realm = new AuthRealm(); @@ -122,14 +133,15 @@ public class ShiroConfig { } - //配置核心安全事务管理器 + /** + * 在Spring Boot2.x中如果直接使用SecurityManager不会生效,而是使用SessionSecurityManager + * + * @param authRealm {@link AuthRealm} + * @return {@link SessionsSecurityManager} + */ @Bean -// public SecurityManager securityManager(@Qualifier("authRealm")AuthRealm authRealm,@Qualifier("redisCacheManager")CacheManager -// cacheManager) { - public SessionsSecurityManager securityManager(AuthorizingRealm authRealm) { - - logger.info("--------------shiro已经加载----------------"); - DefaultWebSecurityManager manager=new DefaultWebSecurityManager(); + public SessionsSecurityManager securityManager(AuthorizingRealm authRealm, CookieRememberMeManager rememberMeManager) { + DefaultWebSecurityManager manager = new DefaultWebSecurityManager(); // 设置realm. manager.setRealm(authRealm); @@ -137,56 +149,44 @@ public class ShiroConfig { //注意:开发时请先关闭,如不关闭热启动会报错 // manager.setCacheManager(cacheManager);//这个如果执行多次,也是同样的一个对象; //注入记住我管理器; - manager.setRememberMeManager(rememberMeManager()); - - + manager.setRememberMeManager(rememberMeManager); + log.info("[ShiroConfig#securityManager] ---> shiro已经加载"); return manager; } /** - * shiro缓存管理器; - * 需要注入对应的其它的实体类中: - * 1、安全管理器:securityManager - * 可见securityManager是整个shiro的核心; + * Cookie对象 * * @return - */ - - - - - - /** - * cookie对象; - * @return * */ @Bean public SimpleCookie rememberMeCookie(){ - //这个参数是cookie的名称,对应前端的checkbox的name = rememberMe + // 这个参数是cookie的名称,对应前端的checkbox的name = rememberMe SimpleCookie simpleCookie = new SimpleCookie("rememberMe"); - // - /* simpleCookie.setMaxAge(259200);*/ + // 单位秒 simpleCookie.setMaxAge(20); - logger.info("--------------rememberMeCookie init---------------"+simpleCookie); + log.info("[ShiroConfig#rememberMeCookie] ---> rememberMeCookie init success"); return simpleCookie; } + /** - * cookie管理对象; - * @return + * Cookie管理对象 + * + * @return {@link CookieRememberMeManager} */ @Bean - public CookieRememberMeManager rememberMeManager(){ + public CookieRememberMeManager rememberMeManager(SimpleCookie rememberMeCookie){ CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager(); - cookieRememberMeManager.setCookie(rememberMeCookie()); - - logger.info("--------------rememberMeManager init---------------"+cookieRememberMeManager); + cookieRememberMeManager.setCookie(rememberMeCookie); + log.info("[ShiroConfig#rememberMeManager] ---> rememberMeManager init success"); return cookieRememberMeManager; } /** * 保证实现了Shiro内部lifecycle函数的bean执行 - * @return + * + * @return LifecycleBeanPostProcessor */ @Bean public LifecycleBeanPostProcessor lifecycleBeanPostProcessor(){ @@ -195,7 +195,8 @@ public class ShiroConfig { /** * AOP式方法级权限检查 - * @return + * + * @return DefaultAdvisorAutoProxyCreator */ @Bean public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator(){ @@ -203,9 +204,9 @@ public class ShiroConfig { creator.setProxyTargetClass(true); return creator; } + @Bean public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) { - // SecurityManager manager= securityManager(authRealm); AuthorizationAttributeSourceAdvisor advisor=new AuthorizationAttributeSourceAdvisor(); advisor.setSecurityManager(securityManager); return advisor; diff --git a/slife-web/src/main/java/com/slife/config/plus/SysMetaObjectHandler.java b/slife-web/src/main/java/com/slife/config/plus/SysMetaObjectHandler.java index 3cf4098..43cd415 100644 --- a/slife-web/src/main/java/com/slife/config/plus/SysMetaObjectHandler.java +++ b/slife-web/src/main/java/com/slife/config/plus/SysMetaObjectHandler.java @@ -2,32 +2,31 @@ package com.slife.config.plus; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import com.slife.shiro.SlifeSysUser; +import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.reflection.MetaObject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; - import java.util.Date; /** - * mybatisplus自定义填充公共字段 ,即没有传的字段自动填充 + * Mybatis-Plus自定义填充公共字段 ,即没有传的字段自动填充 + * * @author chen */ +@Slf4j @Component public class SysMetaObjectHandler implements MetaObjectHandler { - private Logger logger = LoggerFactory.getLogger(getClass()); - - //新增填充 + /** + * inset + * @param metaObject MetaObject + */ @Override public void insertFill(MetaObject metaObject) { - logger.debug("insert set createTime createBy updateTime updateBy param"); + log.debug("[SysMetaObjectHandler#insertFill] ---> insert set createTime createBy updateTime updateBy param"); Object createDate = metaObject.getValue("createDate"); Object createId = metaObject.getValue("createId"); Object updateDate = metaObject.getValue("updateDate"); Object updateId = metaObject.getValue("updateId"); - - if (null == createDate) { metaObject.setValue("createDate", new Date()); } @@ -42,13 +41,14 @@ public class SysMetaObjectHandler implements MetaObjectHandler { } } - //更新填充 + /** + * update + * @param metaObject MetaObject + */ @Override public void updateFill(MetaObject metaObject) { - logger.debug("update set updateTime updateBy param"); - + log.debug("[SysMetaObjectHandler#updateFill] ---> update set updateTime updateBy param"); metaObject.setValue("updateDate", new Date()); - metaObject.setValue("updateId", SlifeSysUser.id());