{"id":604,"date":"2018-05-18T11:25:03","date_gmt":"2018-05-18T03:25:03","guid":{"rendered":"https:\/\/www.dd-home.top\/?p=604"},"modified":"2018-05-18T11:25:03","modified_gmt":"2018-05-18T03:25:03","slug":"apache-shiro-%e5%9c%a8springmvc%e4%b8%ad%e5%9f%ba%e6%9c%ac%e9%85%8d%e7%bd%ae","status":"publish","type":"post","link":"https:\/\/www.dd-home.top\/?p=604","title":{"rendered":"Apache Shiro \u5728SpringMVC\u4e2d\u57fa\u672c\u914d\u7f6e"},"content":{"rendered":"<p><!--more--><\/p>\n<p>1.web.xml\u4e2d\u914d\u7f6eshiro\u7684\u8fc7\u6ee4\u5668<\/p>\n<pre class=\"lang:xhtml decode:true\">&lt;!-- shiro \u5b89\u5168\u8fc7\u6ee4\u5668 --&gt;\n    &lt;!-- The filter-name matches name of a 'shiroFilter' bean inside applicationContext.xml --&gt;\n    &lt;filter&gt;\n        &lt;filter-name&gt;shiroFilter&lt;\/filter-name&gt;\n        &lt;filter-class&gt;org.springframework.web.filter.DelegatingFilterProxy&lt;\/filter-class&gt;\n        &lt;async-supported&gt;true&lt;\/async-supported&gt;\n        &lt;init-param&gt;\n            &lt;param-name&gt;targetFilterLifecycle&lt;\/param-name&gt;\n            &lt;param-value&gt;true&lt;\/param-value&gt;\n        &lt;\/init-param&gt;\n    &lt;\/filter&gt;\n\n    &lt;!-- Make sure any request you want accessible to Shiro is filtered. \/* catches all --&gt;\n    &lt;!-- requests.  Usually this filter mapping is defined first (before all others) to --&gt;\n    &lt;!-- ensure that Shiro works in subsequent filters in the filter chain:             --&gt;\n    &lt;filter-mapping&gt;\n        &lt;filter-name&gt;shiroFilter&lt;\/filter-name&gt;\n        &lt;url-pattern&gt;\/*&lt;\/url-pattern&gt;\n    &lt;\/filter-mapping&gt;<\/pre>\n<p>2.spring-shiro.xml<\/p>\n<pre class=\"lang:xhtml decode:true \">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n&lt;beans xmlns=\"http:\/\/www.springframework.org\/schema\/beans\"\n       xmlns:util=\"http:\/\/www.springframework.org\/schema\/util\"\n       xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\" xmlns:aop=\"http:\/\/www.springframework.org\/schema\/aop\"\n       xsi:schemaLocation=\"http:\/\/www.springframework.org\/schema\/beans http:\/\/www.springframework.org\/schema\/beans\/spring-beans.xsd\n       http:\/\/www.springframework.org\/schema\/util http:\/\/www.springframework.org\/schema\/util\/spring-util.xsd http:\/\/www.springframework.org\/schema\/aop http:\/\/www.springframework.org\/schema\/aop\/spring-aop.xsd\"&gt;\n    &lt;!-- \u7f13\u5b58\u7ba1\u7406\u5668 \u4f7f\u7528Ehcache\u5b9e\u73b0 --&gt;\n    &lt;aop:config proxy-target-class=\"true\"\/&gt;\n\n    &lt;bean class=\"org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator\"\n          depends-on=\"lifecycleBeanPostProcessor\"&gt;\n        &lt;property name=\"proxyTargetClass\" value=\"true\"\/&gt;\n    &lt;\/bean&gt;\n\n    &lt;!-- Shiro\u751f\u547d\u5468\u671f\u5904\u7406\u5668--&gt;\n    &lt;bean id=\"lifecycleBeanPostProcessor\" class=\"org.apache.shiro.spring.LifecycleBeanPostProcessor\"\/&gt;\n\n    &lt;bean class=\"org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor\"&gt;\n        &lt;property name=\"securityManager\" ref=\"securityManager\"\/&gt;\n    &lt;\/bean&gt;\n\n\n    &lt;bean id=\"ehCacheManager\" class=\"org.springframework.cache.ehcache.EhCacheManagerFactoryBean\"&gt;\n        &lt;property name=\"configLocation\" value=\"classpath:ehcache.xml\"\/&gt;\n        &lt;property name=\"shared\" value=\"true\"&gt;&lt;\/property&gt;\n    &lt;\/bean&gt;\n\n    &lt;bean id=\"cacheManager\" class=\"org.apache.shiro.cache.ehcache.EhCacheManager\"&gt;\n        &lt;property name=\"cacheManager\" ref=\"ehCacheManager\"\/&gt;\n    &lt;\/bean&gt;\n    &lt;!-- \u51ed\u8bc1\u5339\u914d\u5668 --&gt;\n    &lt;bean id=\"credentialsMatcher\"\n          class=\"com.jiaqiang.pop.auth.credentials.RetryLimitHashedCredentialsMatcher\"&gt;\n        &lt;constructor-arg ref=\"cacheManager\"\/&gt;\n        &lt;property name=\"hashAlgorithmName\" value=\"md5\"\/&gt;\n        &lt;property name=\"hashIterations\" value=\"2\"\/&gt;\n        &lt;property name=\"storedCredentialsHexEncoded\" value=\"true\"\/&gt;\n    &lt;\/bean&gt;\n\n    &lt;!-- Realm\u5b9e\u73b0 --&gt;\n    &lt;bean id=\"userRealm\" class=\"com.jiaqiang.pop.auth.realm.UserRealm\"&gt;\n        &lt;property name=\"userService\" ref=\"userService\"\/&gt;\n        &lt;property name=\"credentialsMatcher\" ref=\"credentialsMatcher\"\/&gt;\n        &lt;property name=\"cachingEnabled\" value=\"true\"\/&gt;\n        &lt;property name=\"authenticationCacheName\" value=\"authenticationCache\"\/&gt;\n        &lt;property name=\"authorizationCacheName\" value=\"authorizationCache\"\/&gt;\n        &lt;property name=\"authenticationCachingEnabled\" value=\"true\"\/&gt;\n        &lt;property name=\"authorizationCachingEnabled\" value=\"true\"\/&gt;\n    &lt;\/bean&gt;\n\n    &lt;!-- \u4f1a\u8bddID\u751f\u6210\u5668 --&gt;\n    &lt;bean id=\"sessionIdGenerator\" class=\"org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator\"\/&gt;\n\n    &lt;!-- \u4f1a\u8bddCookie\u6a21\u677f --&gt;\n    &lt;bean id=\"sessionIdCookie\" class=\"org.apache.shiro.web.servlet.SimpleCookie\"&gt;\n        &lt;constructor-arg value=\"sid\"\/&gt;\n        &lt;property name=\"httpOnly\" value=\"true\"\/&gt;\n        &lt;property name=\"maxAge\" value=\"-1\"\/&gt;\n    &lt;\/bean&gt;\n    &lt;bean id=\"rememberMeCookie\" class=\"org.apache.shiro.web.servlet.SimpleCookie\"&gt;\n        &lt;constructor-arg value=\"rememberMe\"\/&gt;\n        &lt;property name=\"httpOnly\" value=\"true\"\/&gt;\n        &lt;property name=\"path\" value=\"\/\"\/&gt;\n        &lt;property name=\"maxAge\" value=\"2592000\"\/&gt;&lt;!-- 30\u5929--&gt;\n    &lt;\/bean&gt;\n\n    &lt;!-- rememberMe\u7ba1\u7406\u5668--&gt;\n    &lt;bean id=\"rememberMeManager\"\n          class=\"org.apache.shiro.web.mgt.CookieRememberMeManager\"&gt;\n        &lt;property name=\"cipherKey\" value=\"#{T(org.apache.shiro.codec.Base64).decode('4AvVhmFLUs0KTA3Kprsdag==')}\"\/&gt;\n        &lt;property name=\"cookie\" ref=\"rememberMeCookie\"\/&gt;\n    &lt;\/bean&gt;\n\n    &lt;!-- \u4f1a\u8bddDAO --&gt;\n    &lt;bean id=\"sessionDAO\" class=\"org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO\"&gt;\n        &lt;property name=\"activeSessionsCacheName\" value=\"shiro-activeSessionCache\"\/&gt;\n        &lt;property name=\"sessionIdGenerator\" ref=\"sessionIdGenerator\"\/&gt;\n    &lt;\/bean&gt;\n\n    &lt;!-- \u4f1a\u8bdd\u9a8c\u8bc1\u8c03\u5ea6\u5668 --&gt;\n    &lt;bean id=\"sessionValidationScheduler\" class=\"org.apache.shiro.session.mgt.quartz.QuartzSessionValidationScheduler\"&gt;\n        &lt;property name=\"sessionValidationInterval\" value=\"1800000\"\/&gt;\n        &lt;property name=\"sessionManager\" ref=\"sessionManager\"\/&gt;\n    &lt;\/bean&gt;\n\n    &lt;!-- \u4f1a\u8bdd\u7ba1\u7406\u5668 --&gt;\n    &lt;bean id=\"sessionManager\" class=\"org.apache.shiro.web.session.mgt.DefaultWebSessionManager\"&gt;\n        &lt;property name=\"globalSessionTimeout\" value=\"1800000\"\/&gt;\n        &lt;property name=\"deleteInvalidSessions\" value=\"true\"\/&gt;\n        &lt;property name=\"sessionValidationSchedulerEnabled\" value=\"true\"\/&gt;\n        &lt;property name=\"sessionValidationScheduler\" ref=\"sessionValidationScheduler\"\/&gt;\n        &lt;property name=\"sessionDAO\" ref=\"sessionDAO\"\/&gt;\n        &lt;property name=\"sessionIdCookieEnabled\" value=\"true\"\/&gt;\n        &lt;property name=\"sessionIdCookie\" ref=\"sessionIdCookie\"\/&gt;\n    &lt;\/bean&gt;\n\n    &lt;!-- \u5b89\u5168\u7ba1\u7406\u5668 --&gt;\n    &lt;bean id=\"securityManager\" class=\"org.apache.shiro.web.mgt.DefaultWebSecurityManager\"&gt;\n        &lt;property name=\"realm\" ref=\"userRealm\"\/&gt;\n        &lt;property name=\"sessionManager\" ref=\"sessionManager\"\/&gt;\n        &lt;property name=\"cacheManager\" ref=\"cacheManager\"\/&gt;\n        &lt;property name=\"rememberMeManager\" ref=\"rememberMeManager\"\/&gt;\n    &lt;\/bean&gt;\n\n    &lt;!-- \u76f8\u5f53\u4e8e\u8c03\u7528SecurityUtils.setSecurityManager(securityManager) --&gt;\n    &lt;bean class=\"org.springframework.beans.factory.config.MethodInvokingFactoryBean\"&gt;\n        &lt;property name=\"staticMethod\" value=\"org.apache.shiro.SecurityUtils.setSecurityManager\"\/&gt;\n        &lt;property name=\"arguments\" ref=\"securityManager\"\/&gt;\n    &lt;\/bean&gt;\n\n    &lt;!-- \u57fa\u4e8eForm\u8868\u5355\u7684\u8eab\u4efd\u9a8c\u8bc1\u8fc7\u6ee4\u5668 --&gt;\n    &lt;bean id=\"formAuthenticationFilter\" class=\"com.jiaqiang.pop.auth.realm.FormAuthenticationCaptchaFilter\"&gt;\n        &lt;property name=\"usernameParam\" value=\"username\"\/&gt;\n        &lt;property name=\"passwordParam\" value=\"password\"\/&gt;\n        &lt;property name=\"loginUrl\" value=\"\/login\"\/&gt;\n        &lt;property name=\"rememberMeParam\" value=\"rememberMe\"\/&gt;\n        &lt;property name=\"successUrl\" value=\"\/control\/index\"\/&gt;\n        &lt;property name=\"captchaParam\" value=\"code\"\/&gt;\n    &lt;\/bean&gt;\n\n    &lt;bean id=\"sysUserFilter\" class=\"com.jiaqiang.pop.filter.SysUserFilter\"\/&gt;\n    &lt;!-- Shiro\u7684Web\u8fc7\u6ee4\u5668 --&gt;\n    &lt;bean id=\"shiroFilter\" class=\"org.apache.shiro.spring.web.ShiroFilterFactoryBean\"&gt;\n        &lt;property name=\"securityManager\" ref=\"securityManager\"\/&gt;\n        &lt;property name=\"loginUrl\" value=\"\/login\"\/&gt;\n        &lt;property name=\"unauthorizedUrl\" value=\"\/unauthorized.jsp\"\/&gt;\n        &lt;property name=\"successUrl\" value=\"\/control\/index\"\/&gt;\n        &lt;property name=\"filters\"&gt;\n            &lt;util:map&gt;\n                &lt;entry key=\"authc\" value-ref=\"formAuthenticationFilter\"\/&gt;\n                &lt;entry key=\"sysUser\" value-ref=\"sysUserFilter\"\/&gt;\n            &lt;\/util:map&gt;\n        &lt;\/property&gt;\n        &lt;property name=\"filterChainDefinitions\"&gt;\n            &lt;value&gt;\n                \/static\/**=anon\n                \/diagram-viewer\/**=anon\n                \/editor-app\/**=anon\n                \/modeler.html=anon\n                \/favicon.ico=anon\n                \/captcha-image.do = anon\n                \/index.jsp = anon\n                \/unauthorized.jsp = anon\n                \/login = authc\n                \/logout = logout\n                \/** =authc,sysUser,user,perms,roles\n               &lt;!-- \/** = authc,sysUser,user,perms,roles--&gt;\n            &lt;\/value&gt;\n        &lt;\/property&gt;\n    &lt;\/bean&gt;\n&lt;\/beans&gt;<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[30,36],"tags":[],"class_list":["post-604","post","type-post","status-publish","format-standard","hentry","category-spring","category-web"],"_links":{"self":[{"href":"https:\/\/www.dd-home.top\/index.php?rest_route=\/wp\/v2\/posts\/604","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dd-home.top\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dd-home.top\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dd-home.top\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dd-home.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=604"}],"version-history":[{"count":0,"href":"https:\/\/www.dd-home.top\/index.php?rest_route=\/wp\/v2\/posts\/604\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.dd-home.top\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=604"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dd-home.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=604"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dd-home.top\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=604"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}