碰到一个奇怪的问题,配置类不能随便继承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回答

JoJo

2018-08-07

没有重写 WebSecurityConfigurerAdapter 的任何方法不代表 WebSecurityConfigurerAdapter 本身不会做任何事情。你继承了它,它就会做事了。不需要你重写方法,重写方法只是按自己的需要去定制它如何做事。

0
1
TinyLeon
非常感谢!
2018-08-08
共1条回复

Spring Security技术栈开发企业级认证与授权

Spring Security技术栈,REST风格开发常见接口,独立开发认证授权模块保证REST服务安全

2662 学习 · 1561 问题

查看课程