如何在特定URL上应用spring security并使用java config保留其他人?

时间:2015-05-14 08:14:01

标签: spring spring-mvc spring-security spring-boot

我正在使用java配置来应用spring安全性,并且我能够在特定网址上应用安全性,但是我想要弹出安全性的默认登录页面,只要有人点击url而不是url,这是不安全的。 这是我的SecurityConfig代码:

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
//import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.web.bind.annotation.RequestMethod;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter
{

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

    @Override
     protected void configure(HttpSecurity http) throws Exception {
         http
            .authorizeRequests()
                .antMatchers("/myproject/userCont/user").permitAll()
                .anyRequest().authenticated()
                .and()
                .formLogin()
                .loginPage("/myproject/login/form")
                .loginProcessingUrl("/login")
                .failureUrl("/login/form?error")
                .permitAll();
}

所以当我使用GET方法命中/ myproject / userCont / user时它可以正常工作但是当我使用POST方法或其他网址弹出相同的网址时,弹簧安全性不显示默认登录页面。

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

doGet and doPost in Servlets

您应该浏览上面的链接,以清楚了解GET和POST方法。

要删除/ myproject / userCont / user url的spring安全性,代码应如下所示:

@Override
     protected void configure(HttpSecurity http) throws Exception {
         http
            .authorizeRequests()
                .anyRequest().authenticated()
                .and()
                .formLogin()
                .loginPage("/myproject/login/form")
                .loginProcessingUrl("/login")
                .failureUrl("/login/form?error")
                .permitAll();
}

此外,您不应将您的网址转换为POST方法,因为这会更改网页的整个行为。

当我们在xml文件中时

在配置元素中,您可以使用限制对特定URL的访问 一个或多个元素。每个元素指定一个URL模式 以及访问URL所需的一组访问属性。请记住,你必须 始终在URL模式的末尾包含通配符。如果不这样做将构成URL模式 无法匹配具有请求参数的网址。

 <security:http auto-config="true" >  
 <security:intercept-url pattern="/index*" access="ROLE_USER" />
 <security:intercept-url pattern="/Transit*" access="ROLE_USER" />
 <security:form-login login-page="/login.htm" default-target-url="/index.htm"  
  authentication-failure-url="/loginerror.htm" />  
 <security:logout logout-success-url="/logout.htm" />
 </security:http>

如果我们要描述一个没有任何安全性的url,那么我们应该从安全配置的xml文件下面的上面代码行中删除特定的url。 例如,如果我们不需要索引页面的任何安全性,那么上面的编码应该是这样的。

<security:http auto-config="true" >  
     <security:intercept-url pattern="/Transit*" access="ROLE_USER" />
     <security:form-login login-page="/login.htm" default-target-url="/index.htm"  
      authentication-failure-url="/loginerror.htm" />  
     <security:logout logout-success-url="/logout.htm" />
     </security:http>