我正在开发一个 JAXRS Web 服务,我需要同时进行身份验证和授权。授权部分很简单,但我试图弄清楚如何进行身份验证。请注意,我知道什么是身份验证,但我正在寻找一个实现,或者创建我自己的。我已经阅读了有关 Spring 安全性的信息,但其中很多解决方案都涉及 XML 配置,而我将选择零 XML 配置。我知道这是一项艰巨的任务。但到目前为止一切顺利,直到身份验证。这是我的 Jetty 启动器:
package com.example.app.web;
import com.example.app.context.Config;
import org.apache.cxf.transport.servlet.CXFServlet;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.springframework.web.context.ContextLoaderListener;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
public class JettyStarter {
public static void main( final String[] args ) throws Exception {
Server server = new Server(8080);
final ServletHolder servletHolder = new ServletHolder(new CXFServlet());
final ServletContextHandler context = new ServletContextHandler();
context.setContextPath("/");
context.addServlet(servletHolder, "/app/*");
context.addEventListener(new ContextLoaderListener());
context.setInitParameter("contextClass", AnnotationConfigWebApplicationContext.class.getName());
context.setInitParameter("contextConfigLocation", Config.class.getName());
server.setHandler(context);
server.start();
server.join();
}
}
我的 Config 类同样是无 XML 的:
@Configuration
@ComponentScan("com.example.app")
public class Config {
@Bean(destroyMethod = "shutdown")
public SpringBus cxf() {
return new SpringBus();
}
@Bean
public JaxRsApiApplication jaxRsApiApplication() {
return new JaxRsApiApplication();
}
// etc...
}
现在我想加入某种身份验证阶段,如果这意味着不使用 XML 编程,我不介意滚动自己的身份验证。但是我如何通知 Spring 我想在 api 路由被命中之前检查身份验证?这个问题有意义吗?
作为一个额外的复杂性,像健康检查这样的路由不需要身份验证,而做真实事情的路由,例如创建帐户、更新用户信息等,则需要身份验证。在完美的场景中,我将 nginx 放在我的 Java 应用程序服务器 (Jetty) 前面,并根据需要进行反向代理。我假设我可以让 nginx 告诉我有关请求的所有信息,包括 cookie,所以这应该是可能的。非常感谢您的帮助!