Адрес фактического проекта электронной коммерции SpringBoot (20k+star):GitHub.com/macro-positive/…
Резюме
Spring Cloud Security предоставляет ряд решений для создания безопасных приложений SpringBoot.В сочетании с Oauth2 может быть реализован единый вход.В этой статье будет подробно рассказано об использовании единого входа.
Введение в единый вход
Единый вход (Single Sign On) означает, что при наличии нескольких систем, в которые необходимо войти, пользователю нужно войти только в одну систему, и он может получить доступ к другим системам, для которых требуется вход, без входа в систему.
Создайте модуль oauth2-client
Здесь мы создаем службу oauth2-client в качестве клиентской службы, для которой необходимо войти в систему, и используем службу oauth2-jwt-server из предыдущего раздела в качестве службы проверки подлинности. может напрямую обращаться к oauth2 — клиенту нужен интерфейс входа в систему, чтобы продемонстрировать функцию единого входа.
- Добавьте связанные зависимости в pom.xml:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-oauth2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.0</version>
</dependency>
- Настройте в application.yml:
server:
port: 9501
servlet:
session:
cookie:
name: OAUTH2-CLIENT-SESSIONID #防止Cookie冲突,冲突会导致登录验证不通过
oauth2-server-url: http://localhost:9401
spring:
application:
name: oauth2-client
security:
oauth2: #与oauth2-server对应的配置
client:
client-id: admin
client-secret: admin123456
user-authorization-uri: ${oauth2-server-url}/oauth/authorize
access-token-uri: ${oauth2-server-url}/oauth/token
resource:
jwt:
key-uri: ${oauth2-server-url}/oauth/token_key
- Добавьте аннотацию @EnableOAuth2Sso в класс запуска, чтобы включить единый вход:
@EnableOAuth2Sso
@SpringBootApplication
public class Oauth2ClientApplication {
public static void main(String[] args) {
SpringApplication.run(Oauth2ClientApplication.class, args);
}
}
- Добавьте интерфейс для получения информации о текущем вошедшем в систему пользователе:
/**
* Created by macro on 2019/9/30.
*/
@RestController
@RequestMapping("/user")
public class UserController {
@GetMapping("/getCurrentUser")
public Object getCurrentUser(Authentication authentication) {
return authentication;
}
}
Изменить конфигурацию сервера аутентификации
Измените класс AuthorizationServerConfig в модуле oauth2-jwt-server и установите связанный путь перехода наhttp://localhost:9501/loginи добавить аутентификацию при получении секретного ключа.
/**
* 认证服务器配置
* Created by macro on 2019/9/30.
*/
@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
//以上省略一堆代码...
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory()
.withClient("admin")
.secret(passwordEncoder.encode("admin123456"))
.accessTokenValiditySeconds(3600)
.refreshTokenValiditySeconds(864000)
// .redirectUris("http://www.baidu.com")
.redirectUris("http://localhost:9501/login") //单点登录时配置
.scopes("all")
.authorizedGrantTypes("authorization_code","password","refresh_token");
}
@Override
public void configure(AuthorizationServerSecurityConfigurer security) {
security.tokenKeyAccess("isAuthenticated()"); // 获取密钥需要身份认证,使用单点登录时必须配置
}
}
Демонстрация системы единого входа в Интернет
-
Запустите службу oauth2-client и службу oauth2-jwt-server;
-
Доступ к интерфейсу, который клиент должен авторизоватьhttp://localhost:9501/user/getCurrentUserОн перейдет к интерфейсу входа в службу авторизации;
- После авторизации перейдите на страницу авторизации;
- После авторизации он перейдет к адресу интерфейса, для которого изначально требовалось разрешение, и отобразит информацию о пользователе для входа в систему;
- Если вам нужно пропустить операцию авторизации для автоматической авторизации, вы можете добавить
autoApprove(true)
Конфигурация:
/**
* 认证服务器配置
* Created by macro on 2019/9/30.
*/
@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
//以上省略一堆代码...
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory()
.withClient("admin")
.secret(passwordEncoder.encode("admin123456"))
.accessTokenValiditySeconds(3600)
.refreshTokenValiditySeconds(864000)
// .redirectUris("http://www.baidu.com")
.redirectUris("http://localhost:9501/login") //单点登录时配置
.autoApprove(true) //自动授权配置
.scopes("all")
.authorizedGrantTypes("authorization_code","password","refresh_token");
}
}
Демонстрация единого входа в интерфейс вызова
Здесь мы используем Postman, чтобы продемонстрировать, как использовать правильный способ вызова клиентского интерфейса, для которого необходимо войти в систему.
-
Чтобы получить доступ к интерфейсу, клиент должен войти в систему:http://localhost:9501/user/getCurrentUser
-
Получите токен доступа, используя аутентификацию Oauth2:
- Введите соответствующую информацию, чтобы получить токен доступа, и нажмите «Запросить токен»:
- В этот момент он перейдет на сервер аутентификации для входа в систему:
- Используйте полученный токен после успешного входа:
- Наконец, интерфейс запроса может получить следующую информацию:
{
"authorities": [
{
"authority": "admin"
}
],
"details": {
"remoteAddress": "0:0:0:0:0:0:0:1",
"sessionId": "63BB793E35383B2FFC608333B3BF4988",
"tokenValue": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJtYWNybyIsInNjb3BlIjpbImFsbCJdLCJleHAiOjE1NzI2OTAxNzUsImF1dGhvcml0aWVzIjpbImFkbWluIl0sImp0aSI6IjIwN2U5MTQzLTVjNTUtNDhkMS1iZmU3LTgwMzUyZTQ3Y2QyZCIsImNsaWVudF9pZCI6ImFkbWluIiwiZW5oYW5jZSI6ImVuaGFuY2UgaW5mbyJ9.xf3cBu9yCm0sME0j3UcP53FwF4tJVJC5aJbEj_Y2XcU",
"tokenType": "bearer",
"decodedDetails": null
},
"authenticated": true,
"userAuthentication": {
"authorities": [
{
"authority": "admin"
}
],
"details": null,
"authenticated": true,
"principal": "macro",
"credentials": "N/A",
"name": "macro"
},
"clientOnly": false,
"oauth2Request": {
"clientId": "admin",
"scope": [
"all"
],
"requestParameters": {
"client_id": "admin"
},
"resourceIds": [],
"authorities": [],
"approved": true,
"refresh": false,
"redirectUri": null,
"responseTypes": [],
"extensions": {},
"grantType": null,
"refreshTokenRequest": null
},
"principal": "macro",
"credentials": "",
"name": "macro"
}
oauth2-client добавляет проверку разрешений
- Добавьте конфигурацию, чтобы включить проверку разрешений на основе метода:
/**
* 在接口上配置权限时使用
* Created by macro on 2019/10/11.
*/
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
@Order(101)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
}
- Добавьте требуемый интерфейс администратора разрешений в UserController в:
/**
* Created by macro on 2019/9/30.
*/
@RestController
@RequestMapping("/user")
public class UserController {
@PreAuthorize("hasAuthority('admin')")
@GetMapping("/auth/admin")
public Object adminAuth() {
return "Has admin auth!";
}
}
- Доступ к интерфейсам, требующим прав администратора:http://localhost:9501/user/auth/admin
- использовать нет
admin
учетная запись с разрешениями, такими какandy:123456
После доступа к интерфейсу после получения токена вы обнаружите, что нет разрешения на доступ.
используемые модули
springcloud-learning
├── oauth2-jwt-server -- 使用jwt的oauth2认证测试服务
└── oauth2-client -- 单点登录的oauth2客户端服务
Адрес исходного кода проекта
публика
проект торгового центраПолный набор учебных пособий сериализуется,Обратите внимание на публичный аккаунтПолучите это прямо сейчас.