碰到一个奇怪的问题,配置类不能随便继承WebSecurityConfigurerAdapter
来源:6-2 实现标准的OAuth服务提供商

TinyLeon
2018-08-06
老师好:
我搭建了一个简单的SpringSecurityOAuth2的框架,非常简单,但是遇到一个很奇怪的问题,我就贴一下代码了。
pom.xml
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- oauth2 --> <dependency> <groupId>org.springframework.security.oauth</groupId> <artifactId>spring-security-oauth2</artifactId> </dependency>
启动类 Application.java
@SpringBootApplication @RestController public class SecurityApplication { private final Logger logger = LoggerFactory.getLogger(getClass()); public static void main(String[] args) { SpringApplication.run(SecurityApplication.class, args); } @GetMapping("/test") public String hello() { logger.info("in controller"); return "hello spring security"; } }
UserdetailsService类
@Component public class MyUserdetailsService implements UserDetailsService { @Autowired private PasswordEncoder passwordEncoder; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { return new User(username, passwordEncoder.encode("123456"), true, true, true, true, AuthorityUtils.commaSeparatedStringToAuthorityList("admin,ROLE_USER")); } }
授权服务器配置类
@Configuration @EnableAuthorizationServer public class ServerConfig { }
资源服务器配置类
@Configuration @EnableResourceServer public class ResourceConfig { }
重头戏来了,问题就出在这上面。上面不是用了PasswordEncoder这个接口么,我在下面的类里给它实例化了一个Bean
@Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Bean public PasswordEncoder PasswordEncoder() { return new BCryptPasswordEncoder(); } }
然后我启动系统,使用密码模式生成token,使用该token访问 /test 接口,结果并没有返回正常的报文信息,而是302,也就是重定向让我跳转。我百思不得其解。
后来我跟老师在6-2的代码一一对比后,我把 SecurityConfig.java 改为下面的
@Configuration public class SecurityConfig { @Bean public PasswordEncoder PasswordEncoder() { return new BCryptPasswordEncoder(); } }
结果发现这样就可以通过token访问 /test 接口了。也就是把继承 WebSecurityConfigurerAdapter 删除掉,问题就解决了。我就是感觉到奇怪,为什么会这样。我只是继承了 WebSecurityConfigurerAdapter ,但是我没有重写任何方法呀,为什么就不行了呢?
谢谢老师!
写回答
1回答
-
没有重写 WebSecurityConfigurerAdapter 的任何方法不代表 WebSecurityConfigurerAdapter 本身不会做任何事情。你继承了它,它就会做事了。不需要你重写方法,重写方法只是按自己的需要去定制它如何做事。
012018-08-08
Spring Security技术栈开发企业级认证与授权
Spring Security技术栈,REST风格开发常见接口,独立开发认证授权模块保证REST服务安全
2662 学习 · 1561 问题
相似问题