ShiroConfiguration.java 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package com.yaozhitech.spring5.config;
  2. import java.util.Arrays;
  3. import java.util.Map;
  4. import javax.servlet.DispatcherType;
  5. import javax.servlet.Filter;
  6. import org.apache.shiro.authc.Authenticator;
  7. import org.apache.shiro.authc.pam.FirstSuccessfulStrategy;
  8. import org.apache.shiro.authc.pam.ModularRealmAuthenticator;
  9. import org.apache.shiro.mgt.SecurityManager;
  10. import org.apache.shiro.mgt.SessionStorageEvaluator;
  11. import org.apache.shiro.realm.Realm;
  12. import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
  13. import org.apache.shiro.spring.web.config.ShiroFilterChainDefinition;
  14. import org.apache.shiro.web.mgt.DefaultWebSessionStorageEvaluator;
  15. import org.springframework.boot.web.servlet.FilterRegistrationBean;
  16. import org.springframework.context.annotation.Bean;
  17. import org.springframework.context.annotation.Configuration;
  18. import com.yaozhitech.spring5.filter.AnyRolesAuthorizationFilter;
  19. import com.yaozhitech.spring5.filter.JwtAuthFilter;
  20. import com.yaozhitech.spring5.jwt.JWTShiroRealm;
  21. import com.yaozhitech.spring5.service.JwtUserService;
  22. @Configuration
  23. public abstract class ShiroConfiguration {
  24. /**
  25. * 注册shiro的Filter,拦截请求
  26. */
  27. @Bean
  28. public FilterRegistrationBean<Filter> filterRegistrationBean(SecurityManager securityManager,JwtUserService userService) throws Exception{
  29. FilterRegistrationBean<Filter> filterRegistration = new FilterRegistrationBean<Filter>();
  30. filterRegistration.setFilter((Filter)shiroFilter(securityManager, userService).getObject());
  31. filterRegistration.addInitParameter("targetFilterLifecycle", "true");
  32. filterRegistration.setAsyncSupported(true);
  33. filterRegistration.setEnabled(true);
  34. filterRegistration.setDispatcherTypes(DispatcherType.REQUEST, DispatcherType.ASYNC);
  35. return filterRegistration;
  36. }
  37. @Bean
  38. public Authenticator authenticator(JwtUserService userService) {
  39. ModularRealmAuthenticator authenticator = new ModularRealmAuthenticator();
  40. authenticator.setRealms(Arrays.asList(jwtShiroRealm(userService)));
  41. authenticator.setAuthenticationStrategy(new FirstSuccessfulStrategy());
  42. return authenticator;
  43. }
  44. /**
  45. * 禁用session, 不保存用户登录状态。保证每次请求都重新认证。
  46. * 需要注意的是,如果用户代码里调用Subject.getSession()还是可以用session,如果要完全禁用,要配合下面的noSessionCreation的Filter来实现
  47. */
  48. @Bean
  49. protected SessionStorageEvaluator sessionStorageEvaluator(){
  50. DefaultWebSessionStorageEvaluator sessionStorageEvaluator = new DefaultWebSessionStorageEvaluator();
  51. sessionStorageEvaluator.setSessionStorageEnabled(false);
  52. return sessionStorageEvaluator;
  53. }
  54. /**
  55. * 用于JWT token认证的realm
  56. */
  57. @Bean("jwtRealm")
  58. public Realm jwtShiroRealm(JwtUserService userService) {
  59. JWTShiroRealm myShiroRealm = new JWTShiroRealm(userService);
  60. return myShiroRealm;
  61. }
  62. /**
  63. * 设置过滤器,将自定义的Filter加入
  64. */
  65. @Bean
  66. public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager, JwtUserService userService) {
  67. ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
  68. factoryBean.setSecurityManager(securityManager);
  69. Map<String, Filter> filterMap = factoryBean.getFilters();
  70. filterMap.put("authcToken", createAuthFilter(userService));
  71. filterMap.put("anyRole", createRolesFilter());
  72. factoryBean.setFilters(filterMap);
  73. factoryBean.setFilterChainDefinitionMap(shiroFilterChainDefinition().getFilterChainMap());
  74. return factoryBean;
  75. }
  76. public abstract ShiroFilterChainDefinition shiroFilterChainDefinition() ;
  77. //注意不要加@Bean注解,不然spring会自动注册成filter
  78. protected JwtAuthFilter createAuthFilter(JwtUserService userService){
  79. return new JwtAuthFilter(userService);
  80. }
  81. protected AnyRolesAuthorizationFilter createRolesFilter(){
  82. return new AnyRolesAuthorizationFilter();
  83. }
  84. }