Micronaut 安全性未能 "secure"
Micronaut security fails to "secure"
我有一个简单的基于 Micronaut 的 "hello world" 服务,它内置了一个简单的安全性(为了测试和说明 Micronaut 的安全性)。服务中实现hello服务的controller代码如下:
@Controller("/hello")
public class HelloController
{
public HelloController()
{
// Might put some stuff in in the future
}
@Get("/")
@Produces(MediaType.TEXT_PLAIN)
public String index()
{
return("Hello to the World of Micronaut!!!");
}
}
为了测试安全机制,我按照Micronaut教程的说明创建了一个安全服务class:
@Singleton
public class SecurityService
{
public SecurityService()
{
// Might put in some stuff in the future
}
Flowable<Boolean> checkAuthorization(HttpRequest<?> theReq)
{
Flowable<Boolean> flow = Flowable.fromCallable(()->{
System.out.println("Security Engaged!");
return(false); <== The tutorial says return true
}).subscribeOn(Schedulers.io());
return(flow);
}
}
应该注意的是,与教程不同,flowable.fromCallable() lambda returns 为假。在本教程中,它 returns 正确。我曾假设如果返回 false 安全检查将失败,并且失败将导致 hello 服务无法响应。
根据教程,为了开始使用安全对象,必须有一个过滤器。我创建的过滤器如下所示:
@Filter("/**")
public class HelloFilter implements HttpServerFilter
{
private final SecurityService secService;
public HelloFilter(SecurityService aSec)
{
System.out.println("Filter Created!");
secService = aSec;
}
@Override
public Publisher<MutableHttpResponse<?>> doFilter(HttpRequest<?> theReq, ServerFilterChain theChain)
{
System.out.println("Filtering!");
Publisher<MutableHttpResponse<?>> resp = secService.checkAuthorization(theReq)
.doOnNext(res->{
System.out.println("Responding!");
});
return(resp);
}
}
当我运行 微服务和访问Helo world URL 时出现问题。 (http://localhost:8080/hello) 我不能导致访问服务失败。过滤器捕获所有请求,并且安全对象被占用,但它似乎并没有阻止对 hello 服务的访问。不知道怎么访问才会失败
有人可以帮忙解决这个问题吗?谢谢。
当您无法像往常一样访问资源或处理请求时,您需要更改过滤器中的请求。您的 HelloFilter 如下所示:
@Override
public Publisher<MutableHttpResponse<?>> doFilter(HttpRequest<?> theReq, ServerFilterChain theChain) {
System.out.println("Filtering!");
Publisher<MutableHttpResponse<?>> resp = secService.checkAuthorization(theReq)
.switchMap((authResult) -> { // authResult - is you result from SecurityService
if (!authResult) {
return Publishers.just(HttpResponse.status(HttpStatus.FORBIDDEN)); // reject request
} else {
return theChain.proceed(theReq); // process request as usual
}
})
.doOnNext(res -> {
System.out.println("Responding!");
});
return (resp);
}
最后 - micronaut 具有带 SecurityFilter 的安全模块,您可以使用 @Secured 注解或在配置文件中写入访问规则 more examples in the doc
我有一个简单的基于 Micronaut 的 "hello world" 服务,它内置了一个简单的安全性(为了测试和说明 Micronaut 的安全性)。服务中实现hello服务的controller代码如下:
@Controller("/hello")
public class HelloController
{
public HelloController()
{
// Might put some stuff in in the future
}
@Get("/")
@Produces(MediaType.TEXT_PLAIN)
public String index()
{
return("Hello to the World of Micronaut!!!");
}
}
为了测试安全机制,我按照Micronaut教程的说明创建了一个安全服务class:
@Singleton
public class SecurityService
{
public SecurityService()
{
// Might put in some stuff in the future
}
Flowable<Boolean> checkAuthorization(HttpRequest<?> theReq)
{
Flowable<Boolean> flow = Flowable.fromCallable(()->{
System.out.println("Security Engaged!");
return(false); <== The tutorial says return true
}).subscribeOn(Schedulers.io());
return(flow);
}
}
应该注意的是,与教程不同,flowable.fromCallable() lambda returns 为假。在本教程中,它 returns 正确。我曾假设如果返回 false 安全检查将失败,并且失败将导致 hello 服务无法响应。
根据教程,为了开始使用安全对象,必须有一个过滤器。我创建的过滤器如下所示:
@Filter("/**")
public class HelloFilter implements HttpServerFilter
{
private final SecurityService secService;
public HelloFilter(SecurityService aSec)
{
System.out.println("Filter Created!");
secService = aSec;
}
@Override
public Publisher<MutableHttpResponse<?>> doFilter(HttpRequest<?> theReq, ServerFilterChain theChain)
{
System.out.println("Filtering!");
Publisher<MutableHttpResponse<?>> resp = secService.checkAuthorization(theReq)
.doOnNext(res->{
System.out.println("Responding!");
});
return(resp);
}
}
当我运行 微服务和访问Helo world URL 时出现问题。 (http://localhost:8080/hello) 我不能导致访问服务失败。过滤器捕获所有请求,并且安全对象被占用,但它似乎并没有阻止对 hello 服务的访问。不知道怎么访问才会失败
有人可以帮忙解决这个问题吗?谢谢。
当您无法像往常一样访问资源或处理请求时,您需要更改过滤器中的请求。您的 HelloFilter 如下所示:
@Override
public Publisher<MutableHttpResponse<?>> doFilter(HttpRequest<?> theReq, ServerFilterChain theChain) {
System.out.println("Filtering!");
Publisher<MutableHttpResponse<?>> resp = secService.checkAuthorization(theReq)
.switchMap((authResult) -> { // authResult - is you result from SecurityService
if (!authResult) {
return Publishers.just(HttpResponse.status(HttpStatus.FORBIDDEN)); // reject request
} else {
return theChain.proceed(theReq); // process request as usual
}
})
.doOnNext(res -> {
System.out.println("Responding!");
});
return (resp);
}
最后 - micronaut 具有带 SecurityFilter 的安全模块,您可以使用 @Secured 注解或在配置文件中写入访问规则 more examples in the doc