当前位置: 首页 > 知识库问答 >
问题:

Apache重定向到带有Spring Security的Tomcat应用程序

通典
2023-03-14

我有一个由Tomcat提供服务的java应用程序(即http://111.222.333.444:8080/myapp)。我的客户希望这个应用程序响应一个友好的域(即http://client.example.com)。我不太擅长Apache或Tomcat,但我将Apache配置成这样来执行重定向:

<VirtualHost 111.222.333.444:80>
    ServerName client.example.com
    ProxyRequests Off
    ProxyPreserveHost On
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>
    ProxyPass / http://111.222.333.444:8080/myApp/
    ProxyPassReverse / http://111.222.333.444:8080/myApp/
    ProxyPassReverseCookieDomain 111.222.333.444 client.example.com

    ProxyPass /login.html http://111.222.333.444:8080/login.html
    ProxyPassReverse /login.html http://111.222.333.444:8080/login.html
</VirtualHost>

这对于为http://client.example.com下的应用程序提供服务非常有效。但是,我有一个使用Spring Security实现的登录页面。从http://111.222.333.444:8080/myapp/login.html访问时,该登录可以正常工作。但是,当我从http://client.example.com/login.html访问它并输入有效的用户名和密码时,它只是再次加载登录页面,没有错误。

我的WebSecurityConfigurerAdapter如下所示。如果不将绝对URL传递给loginPage(),我甚至无法让它正确加载登录页面。

@Configuration
@EnableWebMvcSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/resources/**");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable();
        http.authorizeRequests()
                .antMatchers("/admin/**")
                .hasRole("ADMIN")
                .and()
                .formLogin()
                .loginPage("http://client.example.com/login.html")
                .and()
                .logout()
                .logoutSuccessUrl("/");
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser("admin").password("admin").roles("ADMIN");
    }
}

我的登录页面如下所示:

<form name="f" method="post" action="/login.html">               
    <fieldset>
        <legend>Please Login</legend>           
        <label for="username">User</label>
        <select id="username" name="username">
            <option value="-1"></option>
            <option value="admin">admin</option>
        </select>           
        <label for="password">Password</label>
        <input type="password" id="password" name="password"/>
        <div>
            <button type="submit" role="button"><span>Login</span></button>
        </div>
    </fieldset>
</form>

所以当我访问http://client.example.com/admin/test.html时,我被正确地重定向到http://client.example.com/login.html。但是当我尝试用“admin”/“admin”登录时,它只是在http://client.example.com/login.html再次加载登录页面,没有任何错误。apache日志、tomcat日志和应用程序日志没有告诉我任何有用的信息。

我认为这与Apache代理在Spring Security中的性能不好有关,因为它在直接访问Tomcat应用程序时可以正常工作,但我不确定。

  1. 如何让Apache/Spring Security性正确处理登录?我希望应用程序能够识别我已登录,并指示我进入我试图访问的管理页面。
  2. 有没有一种方法可以在不使用WebSecurityConfigurerAdapter中的绝对URL的情况下使登录页正常工作?

Apache版本:Apache/2.2.31(Unix)
Spring Security版本:3.2.6.Release
Tomcat版本:Apache Tomcat/7.0.42
Java版本:Java 1.7

共有1个答案

丰辰沛
2023-03-14

我认为您的登录表单操作不应该指向您的登录页面URL,而是

/j_spring_security_check

UsernamePasswordAuthenticationFilter正在寻找它来模拟身份验证过程。如果您不想使用/j_spring_security_check,可以通过在FormLoginConfigurer上设置调用loginProcessingUrl方法,通知UsernamePasswordAuthenticationFilter查找另一个URL:

formlogin()
    .loginProcessingUrl('/custom_login_url')
    .loginPage("http://client.domain.com/login.html") 
 类似资料:
  • 我已经在我的 Web 应用程序中配置了 SSL。我已经按照所需的步骤在我的 Tomcat 中安装了证书。 我一直关注的导师是https://www.mulesoft.com/tcat/tomcat-security 我已经强制使用 https over http,这意味着任何对 http 的请求都将转发到 https。我在服务器中进行了以下更改.xml 查看更多:https://www.mules

  • 问题内容: __Apache 环境中心 尝试设置从http到https的自动重定向 我尝试将以下内容添加到我的httpd.conf中,但是没有用 有任何想法吗? 问题答案: 我实际上已经遵循了这个示例,并且对我有用:) 然后做:

  • 我正在尝试在tomcat上运行的servlet中使用 ,该servlet从apache服务器接收来自浏览器的请求。因此,任何重定向都将url的'ip.ip.ip'或'someurl.com'部分替换为'localhost:8080'(据我所知,这是因为tomcat将请求源标识为apache服务器地址)。

  • 我有两个在Tomcat7.0下运行的web应用程序 https://secure.example.com:8443 http://insecure.example.com:8080 null 是否可以用单个tomcat实例来配置它?

  • 问题内容: 我有一个网页。该网页将用户重定向到另一个网页,或多或少通过以下方式: 好吧,您知道,我要做的是将GET参数转换为POST参数。不要告诉我这很不好,我知道我自己,这也不是我真正要做的,重要的是我从数组中收集数据并尝试通过POST将其提交到另一个页面。但是,如果用户关闭了JavaScript,它将无法正常工作。我需要知道的是:有没有一种方法可以通过PHP传递POST参数,以便重定向也可以通

  • 问题内容: 是否可以在现有的Java Apache Tomcat项目中引入osgi-equinox?据我了解,OSGI必须在某种“容器”中运行。我将如何整合它? 我还使用Jersey来获取RESTful资源。 问题答案: 在此桥模型中,安装了一个特殊的servlet,Tomcat调用该servlet来处理请求。OSGi运行时是从该servlet内生成的,但是OSGi运行时本身(例如,春分点)与HT