Spring集成Spring Security、OAuth2实现资源访问授权认证。后端主要做的是认证服务器和资源服务。客户端主要是用前端的js请求。因为只是要做一个demo,所以这里的用户信息和授权token都是保存在内存中,后面会根据项目需要将用户信息保存到数据库,授权信息保存到redis。
源码地址:https://github.com/li5454yong/SpringSecurityOAuth2.git
这里需要注意的是:Spring的版本,如果没有特殊需要的话请保持现在的不变,因为我刚开始是使用的是4.0.0,但是项目启动时回报ClassNotFoundException,说找不到org.springframework.web.filter.CorsFilter这个类,后来查看源码,确实没有这个java类。
demo中使用的都是java config风格的配置,没有xml,首先来看Spring的配置。
这里只需要指定注解扫描的包。
配置DispatcherServlet、初始化Spring MVC容器和Spring容器。
可以看到,在这段代码中设置了一下SpringMVC相关的信息,同时还注册了一个拦截器。
下面来看拦截器的代码。
这里和普通web项目中的拦截器并没有什么区别,都是实现了javax.servlet.Filter接口。设置response的header可以解决POST请求跨域的问题。
在这个配置中,创建了两个用户存储在内存中,指定了token的保存方式为内存存储。
下面,需要开启Spring Security的注解
首先是认证服务配置
资源服务配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | @Configuration @EnableResourceServer public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter { private static final String RESOURCE_ID = "my_rest_api"; @Override public void configure(ResourceServerSecurityConfigurer resources) { resources.resourceId(RESOURCE_ID).stateless(false); } @Override public void configure(HttpSecurity http) throws Exception { http. anonymous().disable() .requestMatchers().antMatchers("/user*/**") .and().authorizeRequests() .antMatchers("/user*/**").permitAll() .and().exceptionHandling().accessDeniedHandler(new OAuth2AccessDeniedHandler()); } } |
这里使用PostMan来做http测试工具
首先测试获取token
输入url http://localhost:8080/oauth/token?grant_type=password&username=bob&password=abc123
测试获取用户列表,这里在后台对这个方法要求需要拥有“USER”角色
http://localhost:8080/userList/?access_token=a375bb21-f090-4280-ac6a-98323da16e78
OK,里面还有几个URL,感兴趣的话可以自己去测试,另外,demo中也包含了一个使用Http工具来测试的代码。
这篇文章中,用户信息和token都是保存在内存中,我后面还会发文章,使用spring boot来集成,同时把用户信息保存在MySQL中,token保存在redis,这样会更接近与实际项目场景。
转载请注明:大道至简 » Spring+Spring Security+OAuth2实现REST API权限控制
联系客服