根据官方标准,OAuth 2.0 共用四种授权模式:
- Authorization Code: 用在服务端应用之间,这种最复杂,也是本文采用的模式;
- Implicit: 用在移动app或者webapp(这些app是在用户的设备上的,如在手机上调起微信来进行认证授权)
- Resource Owner Password Credentials(password): 应用直接都是受信任的(都是由一家公司开发的,本例子使用)
- Client Credentials: 用在应用API访问。
1.搭建授权服务器
(1) pom.xml
org.springframework.cloud spring-cloud-starter-oauth2
(2) application.properties
server.port=8110 ## 监听端口
(3) AuthorizationServerApplication.java
@EnableResourceServer // 启用资源服务器 public class AuthorizationServerApplication { // ... }
(4) 配置授权服务的参数
@Configuration @EnableAuthorizationServer public class Oauth2AuthorizationServerConfigurer extends AuthorizationServerConfigurerAdapter { @Override public void configure(final ClientDetailsServiceConfigurer clients) throws Exception { clients.inMemory() .withClient("webapp").secret("secret") //客户端 id/secret .authorizedGrantTypes("authorization code") //授权妈模式 .scopes("user_info") .autoApprove(true) //自动审批 .accessTokenValiditySeconds(3600); //有效期1hour } } @Configuration public class Oauth2WebSecurityConfigurer extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.requestMatchers() .antMatchers("/login", "/oauth/authorize/oauth/logout") .and().authorizeRequests().anyRequest().authenticated() .and().formLogin().permitAll(); } @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication().withUser("admin").password("admin123").roles("ADMIN"); } }
2.客户端访问(业务网站)
(1) pom.xml
org.springframework.cloud spring-cloud-starter-oauth2
(2) application.properties
server port=8080 security.oauth2.client.client-id=webapp security.oauth2.client.client-secret=secret security.oauth2.client.access-token-uri=http://localhost:8110/oauth/token security.oauth2.client.user-authorization-uri=http://localhost:8110/oauth/authorize security.oauth2.resource.user-info-uri=http://localhost:8110/oauth/user
(3) 配置 WEB 安全
@Configuration @EnableOAuth2Sso public class Oauth2WebsecurityConfigurer extends WebSecurityConfigurerAdapter { @Override public void configure(HttpSecurity http) throws Exception { http.antMatcher("/**").authorizeRequests() .antMatchers("/", "/login").permitAll() .anyRequest().authenticated(); } } @RestController public class Oauth2ClientController { @GetMapping("/") public ModelAndView index() { return new ModelAndView("index"); } @GetMapping("/welcome") public ModelAndView welcome() { return new ModelAndView("welcome"); } }3. 用户权限控制(基于角色)
- 授权服务器中,定义各用户拥有的角色: user=USER, admin=ADMIN/USER, root=ROOT/ADMIN/USER
- 业务网站中(client),注解标明哪些角色可
@RestController public class Oauth2ClientController { @GetMapping("/welcome") public ModelAndView welcome() { return new ModelAndView("welcome"); } @GetMapping("/api/user") @PreAuthorize("hasAuthority('USER')") public MapapiUser() { } @GetMapping("/api/admin") @PreAuthorize("hasAuthority('ADMIN')") public Map apiAdmin() { } @GetMapping("/api/root") @PreAuthorize("hasAuthority('ROOT')") public Map apiRoot() { } }
4.权限控制方案(普通结构)
微服务应用与常规服务架构不同,在微服务架构中,Authorization Server/Resource Server 是作为微服务存在的,用户的登录可以通过API网关一次性完成,无需与无法跳转至内网的 Authorization Server 来完成。
解析:实际就是用户首次访问会去授权服务器进行认证,认证后返回用户的身份信息和权限角色信息,用户输入账号密码,进行身份验证通过后,当访问资源,进行权限验证,通过的话则可以访问指定的接口数据。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)