2017-01-01 179 views
-1

我在Google上搜索并搜索到了stackoverflow,但我没有成功配置弹簧安全性问题4

我试图在我的web应用程序中设置弹簧安全。我使用的是嵌入式码头,这些弹簧版本:

  • 春天applicationframework 4.3.5
  • 春季安全4.2.1
  • 砖3

我写了下面的安全配置(一很简单的一个)

@Configuration 
@EnableWebSecurity 
public class WebSecurityCfg extends WebSecurityConfigurerAdapter 
{ 
    @Autowired 
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception 
    { 
     auth.inMemoryAuthentication().withUser("admin").password("123456").roles("ADMIN"); 
    } 

    @Override 
    protected void configure(HttpSecurity http) throws Exception 
    { 

     http 
     .authorizeRequests() 
     .antMatchers("/adminWebTheme/**") 
     .permitAll() 
     .antMatchers("/pages/**") 
     .access("hasRole('ADMIN')") 
     .and() 
     .formLogin() 
     .loginPage("/pages/loginPage") 
     .permitAll() 
     .usernameParameter("username") 
     .passwordParameter("password") 
     .defaultSuccessUrl("/pages/adminHome") 
     .failureUrl("/pages/loginPage?error=true") 
     .and() 
     .logout() 
     .permitAll() 
     .logoutSuccessUrl("/pages/loginPage?logout=true") 
     .and() 
     .csrf(); 

    } 
} 

这是我的安全初始化

public class WebSecurityInitializer extends AbstractSecurityWebApplicationInitializer 
{ 

} 

基本上我想用我的自定义登录表单。 这是我的登录JSP体:

<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles"%> 
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%> 
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 
<%@ page language="java" contentType="text/html; charset=UTF-8" 
    pageEncoding="UTF-8"%> 
<tiles:insertDefinition name="loginPageTemplate"> 
    <tiles:putAttribute name="head"> 
     <title><spring:message code="comm.server.login.page.title" /></title> 
    </tiles:putAttribute> 
    <tiles:putAttribute name="body"> 
     <div class="container"> 
      <div class="row"> 
       <div class="col-md-4 col-md-offset-4"> 
        <div class="login-panel panel panel-default"> 
         <div class="panel-heading"> 
          <h3 class="panel-title"><spring:message code="comm.server.login.msg" /></h3> 
         </div> 
         <div class="panel-body"> 
          <c:if test="${not empty param.error && param.error }"> 
           <div class="alert alert-error">  
            <spring:message code="comm.server.login.error.msg" /> 
           </div> 
          </c:if> 
          <c:if test="${not empty param.logout && param.logout }"> 
           <div class="alert alert-succes">  
            <spring:message code="comm.server.login.logout.msg" /> 
           </div> 
          </c:if>  
          <form role="form" method="post" action='<spring:url value="/login" />'> 
           <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>. 
           <fieldset> 
            <div class="input-group input-sm"> 
             <label class="input-group-addon" for="username"><i class="fa fa-user"></i></label> 
             <input class="form-control" placeholder='<spring:message code="comm.server.login.username.placeholder" />' name="username" id="username" 
              type="text" autofocus> 
            </div> 
            <div class="input-group input-sm"> 
             <label class="input-group-addon" for="password"><i class="fa fa-lock"></i></label> 
             <input class="form-control" placeholder='<spring:message code="comm.server.login.password.placeholder" />' 
              name="password" id="password" type="password" value=""> 
            </div> 
            <div class="checkbox"> 
             <label> <input name="remember" id="remember" type="checkbox" 
              value='<spring:message code="comm.server.login.rememberme" />'><spring:message code="comm.server.login.rememberme" /> 
             </label> 
            </div> 
            <!-- Change this to a button or input when using this as a form --> 
            <!-- <a href="index.html" class="btn btn-lg btn-success btn-block">Login</a> --> 
            <button id="accedi" name="accedi" class="btn btn-lg btn-success btn-block"><spring:message code="comm.server.login.button" /></button> 
           </fieldset> 
          </form> 
         </div> 
        </div> 
       </div> 
      </div> 
     </div> 
    </tiles:putAttribute> 
</tiles:insertDefinition> 

从前面的代码,在我看来,正确的。我试图访问登录页面,我可以成功访问该页面。 现在我有2样的问题:

  1. ,如果我尝试访问该页面... /页/ adminHome登录页面不显示
  2. 如果我把用户名和密码在我的登录页,提交到网址“/登录”失败,因为它告诉我没有登录网址找到

通过以前的行为就好像是春天secuirty完全不叫,我想不通的reasong 当我开始我的应用程序,我看到以下日志:

2017-01-01 12:11:47,470 5469 [main] INFO org.apache.tiles.access.TilesAccess - Publishing TilesContext for context: org.springframework.web.servlet.view.tiles3.SpringWildcardServletTilesApplicationContext 
2017-01-01 12:11:47,522 5521 [main] DEBUG o.s.s.c.a.a.c.AuthenticationConfiguration$EnableGlobalAuthenticationAutowiredConfigurer - Eagerly initializing {webSecurityCfg=it.eng.tz.comm[email protected]16a49a5d} 
2017-01-01 12:11:47,679 5678 [main] DEBUG o.s.s.w.a.e.ExpressionBasedFilterInvocationSecurityMetadataSource - Adding web access control expression 'permitAll', for ExactUrl [processUrl='/pages/loginPage?error=true'] 
2017-01-01 12:11:47,680 5679 [main] DEBUG o.s.s.w.a.e.ExpressionBasedFilterInvocationSecurityMetadataSource - Adding web access control expression 'permitAll', for ExactUrl [processUrl='/pages/loginPage'] 
2017-01-01 12:11:47,681 5680 [main] DEBUG o.s.s.w.a.e.ExpressionBasedFilterInvocationSecurityMetadataSource - Adding web access control expression 'permitAll', for ExactUrl [processUrl='/pages/loginPage'] 
2017-01-01 12:11:47,682 5681 [main] DEBUG o.s.s.w.a.e.ExpressionBasedFilterInvocationSecurityMetadataSource - Adding web access control expression 'permitAll', for Ant [pattern='/logout', POST] 
2017-01-01 12:11:47,682 5681 [main] DEBUG o.s.s.w.a.e.ExpressionBasedFilterInvocationSecurityMetadataSource - Adding web access control expression 'permitAll', for ExactUrl [processUrl='/pages/loginPage?logout=true'] 
2017-01-01 12:11:47,682 5681 [main] DEBUG o.s.s.w.a.e.ExpressionBasedFilterInvocationSecurityMetadataSource - Adding web access control expression 'permitAll', for Ant [pattern='/adminWebTheme/**'] 
2017-01-01 12:11:47,683 5682 [main] DEBUG o.s.s.w.a.e.ExpressionBasedFilterInvocationSecurityMetadataSource - Adding web access control expression 'hasRole('ADMIN')', for Ant [pattern='/pages/**'] 
2017-01-01 12:11:47,693 5692 [main] DEBUG o.s.s.w.a.i.FilterSecurityInterceptor - Validated configuration attributes 
2017-01-01 12:11:47,695 5694 [main] DEBUG o.s.s.w.a.i.FilterSecurityInterceptor - Validated configuration attributes 
2017-01-01 12:11:47,713 5712 [main] INFO o.s.s.w.DefaultSecurityFilterChain - Creating filter chain: [email protected]1, [org.springframework.secu[email protected]3a175162, org.spring[email protected]18acfe88, [email protected]559, [email protected], org.[email protected]3a543f31, org.springframework.s[email protected]7569ea63, org.sp[email protected]772861aa, org.springframework.[email protected]7c1e32c9, org.springfram[email protected]1640190a, o[email protected]8f2098e, org[email protected]53ed09e8, org.springfr[email protected]4743a322] 

现在,在我看来,所有正确配置....但我无法保护我的web应用程序 任何人都可以帮助我吗?

谢谢 安杰洛

修订的建议

至于建议我修改我的春节安全配置做:

@Override 
protected void configure(HttpSecurity http) throws Exception 
{ 

    http 
    .authorizeRequests() 
    .antMatchers("/adminWebTheme/**") 
    .permitAll() 
    .antMatchers("/pages/**") 
    .authenticated() 
    .antMatchers("/pages/**") 
    .access("hasRole('ADMIN')") 
    .and() 
    .formLogin() 
    .loginPage("/pages/loginPage") 
    .permitAll() 
    .usernameParameter("username") 
    .passwordParameter("password") 
    .defaultSuccessUrl("/pages/adminHome") 
    .failureUrl("/pages/loginPage?error") 
    .and() 
    .logout() 
    .permitAll() 
    .logoutSuccessUrl("/pages/loginPage?logout") 
    .and() 
    .csrf() 
    .and() 
    .exceptionHandling() 
    .accessDeniedPage("/pages/accessDenied"); 

} 

没有改变。在我看来,如果Spring安全过滤器不拦截网址......我不知道原因。我敢肯定,这是一个配置问题,但我不明白,我错了......

安杰洛

回答

0

我想我用什么我失踪

和嵌入式码头在哪里手动添加弹簧调度器servlet 所以我不得不添加Spring安全过滤器.... 在我的码头我添加了以下(最重要的是所以SecFilter部分):

DispatcherServlet springSvlt = new DispatcherServlet(context); 
     contextHandler.addServlet(new ServletHolder(springSvlt), MAPPING_URL); 
     contextHandler.addEventListener(new ContextLoaderListener(context)); 
     contextHandler.setResourceBase(new ClassPathResource("webapp").getURI().toString()); 
     //Filtro eTag 
     ServletHandler sh = new ServletHandler(); 
     FilterHolder eTagFilter = sh.addFilterWithMapping(ShallowEtagHeaderFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST)); 
     contextHandler.addFilter(eTagFilter, "/*", EnumSet.of(DispatcherType.REQUEST)); 
     //Filtro Gzip 
     FilterHolder gZipFilter = sh.addFilterWithMapping(ShallowEtagHeaderFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST)); 
     gZipFilter.setInitParameter("varyHeader", "true"); 
     contextHandler.addFilter(gZipFilter, "/*", EnumSet.of(DispatcherType.REQUEST)); 
//  //Filtro sicurezza 
     FilterHolder secFilter = new FilterHolder(new DelegatingFilterProxy("springSecurityFilterChain")); 
     contextHandler.addFilter(secFilter, "/*", EnumSet.allOf(DispatcherType.class)); 

现在它工作正常

谢谢所有和我希望这是有用的

安杰洛