| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- package net.mingsoft.config;
- import java.util.LinkedHashMap;
- import java.util.Map;
- import java.util.Properties;
- import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
- 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.DefaultWebSecurityManager;
- import org.springframework.beans.factory.annotation.Value;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.web.servlet.handler.SimpleMappingExceptionResolver;
- import com.mingsoft.basic.configurer.ShiroTagFreeMarkderConfigurer;
- import net.mingsoft.basic.security.BaseAuthRealm;
- @Configuration
- public class ShiroConfig {
- @Value("${ms.manager.path}")
- private String managerPath;
-
- @Bean
- public ShiroTagFreeMarkderConfigurer freemarkerConfig() {
- return new ShiroTagFreeMarkderConfigurer();
- }
- @Bean
- public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) {
- ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
- shiroFilterFactoryBean.setSecurityManager(securityManager);
- // 拦截器.
- Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
- // 配置不会被拦截的链接 顺序判断,因为前端模板采用了thymeleaf,这里不能直接使用 ("/static/**", "anon")来配置匿名访问,必须配置到每个静态目录
- filterChainDefinitionMap.put("/static/**", "anon");
- filterChainDefinitionMap.put("/html/**", "anon");
- filterChainDefinitionMap.put(managerPath+"/checkLogin.do", "anon");
- filterChainDefinitionMap.put(managerPath+"/login.do", "anon");
- // 配置退出 过滤器,其中的具体的退出代码Shiro已经替我们实现了
- filterChainDefinitionMap.put("/logout", "logout");
- // <!-- 过滤链定义,从上向下顺序执行,一般将/**放在最为下边 -->:这是一个坑呢,一不小心代码就不好使了;
- // <!-- authc:所有url都必须认证通过才可以访问; anon:所有url都都可以匿名访问-->
- filterChainDefinitionMap.put("/**", "anon");
- // 如果不设置默认会自动寻找Web工程根目录下的"/login.jsp"页面
- shiroFilterFactoryBean.setLoginUrl("/login");
- // 登录成功后要跳转的链接
- //shiroFilterFactoryBean.setSuccessUrl("/index");
- // 未授权界面;
- shiroFilterFactoryBean.setUnauthorizedUrl("/403");
- shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
- return shiroFilterFactoryBean;
- }
- /**
- * 凭证匹配器 (由于我们的密码校验交给Shiro的SimpleAuthenticationInfo进行处理了 )
- *
- * @return
- */
- @Bean
- public HashedCredentialsMatcher hashedCredentialsMatcher() {
- HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();
- hashedCredentialsMatcher.setHashAlgorithmName("md5");// 散列算法:这里使用MD5算法;
- hashedCredentialsMatcher.setHashIterations(2);// 散列的次数,比如散列两次,相当于
- // md5(md5(""));
- return hashedCredentialsMatcher;
- }
- @Bean
- public BaseAuthRealm myShiroRealm() {
- BaseAuthRealm myShiroRealm = new BaseAuthRealm();
- myShiroRealm.setCredentialsMatcher(hashedCredentialsMatcher());
- return myShiroRealm;
- }
- @Bean
- public SecurityManager securityManager() {
- DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
- securityManager.setRealm(myShiroRealm());
- return securityManager;
- }
- /**
- * 开启shiro aop注解支持. 使用代理方式;所以需要开启代码支持;
- *
- * @param securityManager
- * @return
- */
- @Bean
- public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
- AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
- authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
- return authorizationAttributeSourceAdvisor;
- }
- @Bean(name = "simpleMappingExceptionResolver")
- public SimpleMappingExceptionResolver createSimpleMappingExceptionResolver() {
- SimpleMappingExceptionResolver r = new SimpleMappingExceptionResolver();
- Properties mappings = new Properties();
- mappings.setProperty("DatabaseException", "databaseError");// 数据库异常处理
- mappings.setProperty("UnauthorizedException", "/user/403");
- r.setExceptionMappings(mappings); // None by default
- r.setDefaultErrorView("error"); // No default
- r.setExceptionAttribute("exception"); // Default is "exception"
- // r.setWarnLogCategory("example.MvcLogger"); // No default
- return r;
- }
- }
|