ShiroConfiguration.java 3.9 KB

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