You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
3.1 KiB
85 lines
3.1 KiB
package net.mingsoft.config; |
|
|
|
import java.util.LinkedHashMap; |
|
import java.util.Map; |
|
|
|
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.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator; |
|
import org.springframework.beans.factory.annotation.Value; |
|
import org.springframework.context.annotation.Bean; |
|
import org.springframework.context.annotation.Configuration; |
|
import org.springframework.context.annotation.PropertySource; |
|
|
|
import net.mingsoft.basic.security.BaseAuthRealm; |
|
|
|
@Configuration |
|
public class ShiroConfig { |
|
|
|
@Value("${ms.manager.path}") |
|
private String managerPath; |
|
|
|
@Bean |
|
public AuthorizationAttributeSourceAdvisor getAuthorizationAttributeSourceAdvisor( |
|
DefaultWebSecurityManager securityManager) { |
|
AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor(); |
|
advisor.setSecurityManager(securityManager); |
|
return advisor; |
|
} |
|
|
|
@Bean |
|
public DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator() { |
|
DefaultAdvisorAutoProxyCreator autoProxyCreator = new DefaultAdvisorAutoProxyCreator(); |
|
autoProxyCreator.setProxyTargetClass(true); |
|
return autoProxyCreator; |
|
} |
|
|
|
@Bean |
|
public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) { |
|
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); |
|
// 必须设置 SecurityManager |
|
shiroFilterFactoryBean.setSecurityManager(securityManager); |
|
// setLoginUrl 如果不设置值,默认会自动寻找Web工程根目录下的"/login.jsp"页面 或 "/login" 映射 |
|
shiroFilterFactoryBean.setLoginUrl(managerPath + "/login.do"); |
|
// 设置无权限时跳转的 url; |
|
shiroFilterFactoryBean.setUnauthorizedUrl(managerPath + "/404.do"); |
|
|
|
// 设置拦截器 |
|
Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>(); |
|
// 游客,开发权限 |
|
filterChainDefinitionMap.put("/static/**", "anon"); |
|
filterChainDefinitionMap.put("/html/**", "anon"); |
|
// 开放登陆接口 |
|
filterChainDefinitionMap.put(managerPath + "/login.do", "anon"); |
|
filterChainDefinitionMap.put(managerPath + "/checkLogin.do", "anon"); |
|
// 其余接口一律拦截 |
|
// 主要这行代码必须放在所有权限设置的最后,不然会导致所有 url 都被拦截 |
|
filterChainDefinitionMap.put(managerPath + "/**", "authc"); |
|
|
|
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); |
|
return shiroFilterFactoryBean; |
|
} |
|
|
|
/** |
|
* 注入 securityManager |
|
*/ |
|
@Bean |
|
public SecurityManager securityManager() { |
|
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); |
|
// 设置realm. |
|
securityManager.setRealm(customRealm()); |
|
return securityManager; |
|
} |
|
|
|
/** |
|
* 自定义身份认证 realm; |
|
* <p> |
|
* 必须写这个类,并加上 @Bean 注解,目的是注入 CustomRealm, 否则会影响 CustomRealm类 中其他类的依赖注入 |
|
*/ |
|
@Bean |
|
public BaseAuthRealm customRealm() { |
|
return new BaseAuthRealm(); |
|
} |
|
}
|
|
|