2017-01-01 177 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)); 

現在它工作正常

謝謝所有和我希望這是有用的

安傑洛