Blame view

src/main/java/com/huaheng/framework/config/ShiroConfig.java 12.8 KB
tangying authored
1
2
3
4
5
package com.huaheng.framework.config;

import java.util.LinkedHashMap;
import java.util.Map;
import javax.servlet.Filter;
mahuandong authored
6
tangying authored
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import org.apache.shiro.cache.ehcache.EhCacheManager;
import org.apache.shiro.codec.Base64;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
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.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.huaheng.common.utils.StringUtils;
import com.huaheng.framework.shiro.realm.UserRealm;
import com.huaheng.framework.shiro.session.OnlineSessionDAO;
import com.huaheng.framework.shiro.session.OnlineSessionFactory;
import com.huaheng.framework.shiro.web.filter.LogoutFilter;
import com.huaheng.framework.shiro.web.filter.online.OnlineSessionFilter;
import com.huaheng.framework.shiro.web.filter.sync.SyncOnlineSessionFilter;
import com.huaheng.framework.shiro.web.session.OnlineWebSessionManager;
import com.huaheng.framework.shiro.web.session.SpringSessionValidationScheduler;
import at.pollux.thymeleaf.shiro.dialect.ShiroDialect;

/**
 * 权限配置加载
mahuandong authored
32
 *
tangying authored
33
34
35
 * @author huaheng
 */
@Configuration
mahuandong authored
36
public class ShiroConfig {
tangying authored
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
    public static final String PREMISSION_STRING = "perms[\"{0}\"]";

    // Session超时时间,单位为毫秒(默认30分钟)
    @Value("${shiro.session.expireTime}")
    private int expireTime;

    // 相隔多久检查一次session的有效性,单位毫秒,默认就是10分钟
    @Value("${shiro.session.validationInterval}")
    private int validationInterval;

    // 验证码开关
    @Value("${shiro.user.captchaEnabled}")
    private boolean captchaEnabled;

    // 验证码类型
    @Value("${shiro.user.captchaType}")
    private String captchaType;

    // 设置Cookie的域名
    @Value("${shiro.cookie.domain}")
    private String domain;

    // 设置cookie的有效访问路径
    @Value("${shiro.cookie.path}")
    private String path;

    // 设置HttpOnly属性
    @Value("${shiro.cookie.httpOnly}")
    private boolean httpOnly;

    // 设置Cookie的过期时间,秒为单位
    @Value("${shiro.cookie.maxAge}")
    private int maxAge;

    // 登录地址
    @Value("${shiro.user.loginUrl}")
    private String loginUrl;

    // 登录地址
    @Value("/admin/login")
    private String loginUrls;

    // 权限认证失败地址
    @Value("${shiro.user.unauthorizedUrl}")
    private String unauthorizedUrl;

    /**
     * 缓存管理器 使用Ehcache实现
     */
    @Bean
mahuandong authored
87
    public EhCacheManager getEhCacheManager() {
tangying authored
88
89
        net.sf.ehcache.CacheManager cacheManager = net.sf.ehcache.CacheManager.getCacheManager("huaheng");
        EhCacheManager em = new EhCacheManager();
mahuandong authored
90
        if (StringUtils.isNull(cacheManager)) {
tangying authored
91
92
            em.setCacheManagerConfigFile("classpath:ehcache/ehcache-shiro.xml");
            return em;
mahuandong authored
93
        } else {
tangying authored
94
95
96
97
98
99
100
101
102
            em.setCacheManager(cacheManager);
            return em;
        }
    }

    /**
     * 自定义Realm
     */
    @Bean
mahuandong authored
103
    public UserRealm userRealm(EhCacheManager cacheManager) {
tangying authored
104
105
106
107
108
109
110
111
112
        UserRealm userRealm = new UserRealm();
        userRealm.setCacheManager(cacheManager);
        return userRealm;
    }

    /**
     * 自定义sessionDAO会话
     */
    @Bean
mahuandong authored
113
    public OnlineSessionDAO sessionDAO() {
tangying authored
114
115
116
117
118
119
120
121
        OnlineSessionDAO sessionDAO = new OnlineSessionDAO();
        return sessionDAO;
    }

    /**
     * 自定义sessionFactory会话
     */
    @Bean
mahuandong authored
122
    public OnlineSessionFactory sessionFactory() {
tangying authored
123
124
125
126
127
128
129
130
        OnlineSessionFactory sessionFactory = new OnlineSessionFactory();
        return sessionFactory;
    }

    /**
     * 自定义sessionFactory调度器
     */
    @Bean
mahuandong authored
131
    public SpringSessionValidationScheduler sessionValidationScheduler() {
tangying authored
132
133
134
135
136
137
138
139
140
141
142
143
        SpringSessionValidationScheduler sessionValidationScheduler = new SpringSessionValidationScheduler();
        // 相隔多久检查一次session的有效性,单位毫秒,默认就是10分钟
        sessionValidationScheduler.setSessionValidationInterval(validationInterval * 60 * 1000);
        // 设置会话验证调度器进行会话验证时的会话管理器
        sessionValidationScheduler.setSessionManager(sessionValidationManager());
        return sessionValidationScheduler;
    }

    /**
     * 会话管理器
     */
    @Bean
mahuandong authored
144
    public OnlineWebSessionManager sessionValidationManager() {
tangying authored
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
        OnlineWebSessionManager manager = new OnlineWebSessionManager();
        // 加入缓存管理器
        manager.setCacheManager(getEhCacheManager());
        // 删除过期的session
        manager.setDeleteInvalidSessions(true);
        // 设置全局session超时时间
        manager.setGlobalSessionTimeout(expireTime * 60 * 1000);
        // 去掉 JSESSIONID
        manager.setSessionIdUrlRewritingEnabled(false);
        // 是否定时检查session
        manager.setSessionValidationSchedulerEnabled(true);
        // 自定义SessionDao
        manager.setSessionDAO(sessionDAO());
        // 自定义sessionFactory
        manager.setSessionFactory(sessionFactory());
        return manager;
    }

    /**
     * 会话管理器
     */
    @Bean
mahuandong authored
167
    public OnlineWebSessionManager sessionManager() {
tangying authored
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
        OnlineWebSessionManager manager = new OnlineWebSessionManager();
        // 加入缓存管理器
        manager.setCacheManager(getEhCacheManager());
        // 删除过期的session
        manager.setDeleteInvalidSessions(true);
        // 设置全局session超时时间
        manager.setGlobalSessionTimeout(expireTime * 60 * 1000);
        // 去掉 JSESSIONID
        manager.setSessionIdUrlRewritingEnabled(false);
        // 定义要使用的无效的Session定时调度器
        manager.setSessionValidationScheduler(sessionValidationScheduler());
        // 是否定时检查session
        manager.setSessionValidationSchedulerEnabled(true);
        // 自定义SessionDao
        manager.setSessionDAO(sessionDAO());
        // 自定义sessionFactory
        manager.setSessionFactory(sessionFactory());
        return manager;
    }

    /**
     * 安全管理器
     */
    @Bean
mahuandong authored
192
    public SecurityManager securityManager(UserRealm userRealm) {
tangying authored
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        // 设置realm.
        securityManager.setRealm(userRealm);
        // 记住我
        securityManager.setRememberMeManager(rememberMeManager());
        // 注入缓存管理器;
        securityManager.setCacheManager(getEhCacheManager());
        // session管理器
        securityManager.setSessionManager(sessionManager());
        return securityManager;
    }

    /**
     * 退出过滤器
     */
mahuandong authored
208
    public LogoutFilter logoutFilter() {
tangying authored
209
210
211
212
213
        LogoutFilter logoutFilter = new LogoutFilter();
        logoutFilter.setLoginUrl(loginUrl);
        return logoutFilter;
    }
mahuandong authored
214
    public LogoutFilter logoutFilters() {
tangying authored
215
216
217
218
219
220
221
222
223
        LogoutFilter logoutFilter = new LogoutFilter();
        logoutFilter.setLoginUrl(loginUrls);
        return logoutFilter;
    }

    /**
     * Shiro过滤器配置
     */
    @Bean
mahuandong authored
224
    public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
tangying authored
225
226
227
228
229
230
231
232
233
234
235
236
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        // Shiro的核心安全接口,这个属性是必须的
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        // 身份认证失败,则跳转到登录页面的配置
        shiroFilterFactoryBean.setLoginUrl(loginUrl);
        // 权限认证失败,则跳转到指定页面
        shiroFilterFactoryBean.setUnauthorizedUrl(unauthorizedUrl);
        // Shiro连接约束配置,即过滤链的定义
        LinkedHashMap<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
        // 对静态资源设置匿名访问
        filterChainDefinitionMap.put("/favicon.ico**", "anon");
        filterChainDefinitionMap.put("/huaheng.png**", "anon");
mahuandong authored
237
        filterChainDefinitionMap.put("/logo.png", "anon");
tangying authored
238
239
240
241
        filterChainDefinitionMap.put("/css/**", "anon");
        filterChainDefinitionMap.put("/docs/**", "anon");
        filterChainDefinitionMap.put("/fonts/**", "anon");
        filterChainDefinitionMap.put("/img/**", "anon");
游杰 authored
242
        filterChainDefinitionMap.put("/apk/**", "anon");
游杰 authored
243
        filterChainDefinitionMap.put("/reservation/**", "anon");
tangying authored
244
245
246
247
248
        filterChainDefinitionMap.put("/ajax/**", "anon");
        filterChainDefinitionMap.put("/js/**", "anon");
        filterChainDefinitionMap.put("/huaheng/**", "anon");
        filterChainDefinitionMap.put("/druid/**", "anon");
        filterChainDefinitionMap.put("/captcha/captchaImage**", "anon");
249
        filterChainDefinitionMap.put("/reservation/add", "anon");
tangying authored
250
251
252
253
254
        // 退出 logout地址,shiro去清除session
        filterChainDefinitionMap.put("/logout", "logout");
        filterChainDefinitionMap.put("/admin/logout", "adminlogout");
        // 不需要拦截的访问
//        filterChainDefinitionMap.put("/admin/home", "anon,captchaValidate");
255
256
257
258
259
        filterChainDefinitionMap.put("/mobile/download/*", "anon");
        filterChainDefinitionMap.put("/admin/login", "anon");
        filterChainDefinitionMap.put("/login", "anon");
        filterChainDefinitionMap.put("/api/login", "anon");
        filterChainDefinitionMap.put("/mobile/login", "anon");
游杰 authored
260
        filterChainDefinitionMap.put("/api/getTokenForMobile", "anon");
261
        filterChainDefinitionMap.put("/getWarehouseByUserCode", "anon");
262
263
264
//        filterChainDefinitionMap.put("/websocket", "anon");
//        filterChainDefinitionMap.put("/websocket/*", "anon");
//        filterChainDefinitionMap.put("/user/lincoln/message", "anon");
265
        filterChainDefinitionMap.put("/API/WMS/v2/login", "anon");
mahuandong authored
266
        filterChainDefinitionMap.put("/api/**", "anon");
周峰 authored
267
        filterChainDefinitionMap.put("/endpoint/**", "anon");
游杰 authored
268
        filterChainDefinitionMap.put("/manager/**", "anon");
269
        filterChainDefinitionMap.put("/API/WMS/v2/**","anon");
tangying authored
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
        // 系统权限列表
//        filterChainDefinitionMap.putAll(SpringUtils.getBean(IMenuService.class).selectPermsAll());

        Map<String, Filter> filters = new LinkedHashMap<>();
        filters.put("onlineSession", onlineSessionFilter());
        filters.put("syncOnlineSession", syncOnlineSessionFilter());
        // 注销成功,则跳转到指定页面
        filters.put("logout", logoutFilter());
        filters.put("adminlogout", logoutFilters());
        shiroFilterFactoryBean.setFilters(filters);

        // 所有请求需要认证
        filterChainDefinitionMap.put("/**", "user,onlineSession,syncOnlineSession");
        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);

        return shiroFilterFactoryBean;
    }

    /**
     * 自定义在线用户处理过滤器
     */
    @Bean
mahuandong authored
292
    public OnlineSessionFilter onlineSessionFilter() {
tangying authored
293
294
295
296
297
298
299
300
301
        OnlineSessionFilter onlineSessionFilter = new OnlineSessionFilter();
        onlineSessionFilter.setLoginUrl(loginUrl);
        return onlineSessionFilter;
    }

    /**
     * 自定义在线用户同步过滤器
     */
    @Bean
mahuandong authored
302
    public SyncOnlineSessionFilter syncOnlineSessionFilter() {
tangying authored
303
304
305
306
307
308
309
        SyncOnlineSessionFilter syncOnlineSessionFilter = new SyncOnlineSessionFilter();
        return syncOnlineSessionFilter;
    }

    /**
     * cookie 属性设置
     */
mahuandong authored
310
    public SimpleCookie rememberMeCookie() {
tangying authored
311
312
313
314
315
316
317
318
319
320
321
        SimpleCookie cookie = new SimpleCookie("rememberMe");
        cookie.setDomain(domain);
        cookie.setPath(path);
        cookie.setHttpOnly(httpOnly);
        cookie.setMaxAge(maxAge * 24 * 60 * 60);
        return cookie;
    }

    /**
     * 记住我
     */
mahuandong authored
322
    public CookieRememberMeManager rememberMeManager() {
tangying authored
323
324
325
326
327
328
329
330
331
332
        CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();
        cookieRememberMeManager.setCookie(rememberMeCookie());
        cookieRememberMeManager.setCipherKey(Base64.decode("fCq+/xW488hMTCD+cmJ3aQ=="));
        return cookieRememberMeManager;
    }

    /**
     * thymeleaf模板引擎和shiro框架的整合
     */
    @Bean
mahuandong authored
333
    public ShiroDialect shiroDialect() {
tangying authored
334
335
336
337
338
339
340
341
        return new ShiroDialect();
    }

    /**
     * 开启Shiro注解通知器
     */
    @Bean
    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(
mahuandong authored
342
            @Qualifier("securityManager") SecurityManager securityManager) {
tangying authored
343
344
345
346
347
        AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
        authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
        return authorizationAttributeSourceAdvisor;
    }
}