微服务架构中使用安全认证服务的详细代码说明
时间: 2024-11-10 12:25:48 浏览: 9
在微服务架构中,为了实现安全认证,通常会采用诸如OAuth2、JWT(JSON Web Tokens)等标准协议。这里我将以Spring Cloud OAuth2作为例子,展示一个简单的API Gateway和认证服务的集成。
首先,你需要在API Gateway中配置对认证服务的访问:
```java
@Configuration
@EnableZuulProxy
public class GatewayConfig {
@Bean
public OAuth2RestTemplate restTemplate() {
return new OAuth2RestTemplate(oauth2ClientContext(), resourceServer());
}
@Bean
public ResourceServer(resourceServerProperties()) {
ResourceServer resourceServer = new ResourceServer();
resourceServer.setResourceId("my-resource-server");
return resourceServer;
}
}
```
然后,在需要身份验证的API控制器上,通过`OAuth2RestTemplate`获取访问令牌并注入:
```java
@RestController
@RequestMapping("/api")
public class AuthenticatedController {
private final OAuth2RestTemplate restTemplate;
@Autowired
public AuthenticatedController(OAuth2RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@GetMapping("/protected")
@PreAuthorize("#oauth2.hasScope('read')")
public ResponseEntity<String> protectedEndpoint() {
// 使用访问令牌进行资源访问
String accessToken = restTemplate.getAccessToken();
// 实际的业务逻辑...
}
}
```
在认证服务端(如Keycloak、Azure AD),你将有相应的用户注册、授权逻辑和Token签发/验证服务。例如,使用JWT,你会创建并返回包含用户信息的令牌:
```javascript
// Keycloak服务器(Node.js示例)
const jwt = require('jsonwebtoken');
function generateToken(user) {
const token = jwt.sign(user, 'your-secret-key', { expiresIn: '1h' });
return { access_token: token };
}
app.post('/login', (req, res) => {
// 验证用户名密码,成功后生成token并返回
const user = authenticateUser(req.body.username, req.body.password);
if (user) {
res.json(generateToken(user));
} else {
res.status(401).json({ error: 'Unauthorized' });
}
});
```
阅读全文