스프링 시큐리티 alwaysRemember  = false

설정 내용

  http.rememberMe()
               .key(REMEMBERME_KEY)
               .rememberMeParameter(REMEMBERME_PARAMETER)
               .rememberMeCookieName(REMEMBERME_COOKIENAME)
               .tokenValiditySeconds(60 * 60 * 24 * 7)
               .alwaysRemember(false)
               .tokenRepository(rememberMeTokenRepository)
               .userDetailsService(rememberMeUserService).and();

 

문제

checkbox에 체크를 하고 안하고 에 대해서 rememberme 가 작동하고 안하고 해야하는데 작동을 하지 않아서 원일을 찾아본결과 

login.html코드

<form name="f" action="/login" method="post"	class="form-signin" role="form" onsubmit="return false;">

	<input class="form-control"  name="login_id" type="text" placeholder="<spring:message code="login.form.id"/>" style="margin-bottom:5px;"	autofocus autocomplete="off">
	<input class="form-control"  name="login_password" type="password" placeholder="<spring:message code="login.form.pw"/>" value="">
	<div class="checkbox" style="margin-bottom:13px;">
		<label style="padding-top:5px;">
			<input type="checkbox" id="varsqlRememberMe" name="varsqlRememberMe" value="remember"> Remember me
		</label>
	</div>
	<div style="padding-bottom:10px;">
		<button class="btn btn-lg btn-primary btn-block btn-login" type="button">
			<spring:message code="btn.login" />
		</button>
	</div>

</form>

원인

checkbox 의 value에 값이 있어서 발생한 문제 .

<input type="checkbox" id="varsqlRememberMe" name="varsqlRememberMe" value="remember"> Remember me

해결방안

checkbox 에 value를 삭제 하거나  value="on" 이렇게 추가하면 작동함. 

 

에러 내용. 

Caused by: java.lang.IllegalArgumentException: Can not set rememberMeCookieName and custom rememberMeServices.
	at org.springframework.security.config.annotation.web.configurers.RememberMeConfigurer.validateInput(RememberMeConfigurer.java:306)
	at org.springframework.security.config.annotation.web.configurers.RememberMeConfigurer.init(RememberMeConfigurer.java:270)
	at org.springframework.security.config.annotation.web.configurers.RememberMeConfigurer.init(RememberMeConfigurer.java:80)
	at org.springframework.security.config.annotation.AbstractConfiguredSecurityBuilder.init(AbstractConfiguredSecurityBuilder.java:370)
	at org.springframework.security.config.annotation.AbstractConfiguredSecurityBuilder.doBuild(AbstractConfiguredSecurityBuilder.java:324)
	at org.springframework.security.config.annotation.AbstractSecurityBuilder.build(AbstractSecurityBuilder.java:41)
	at org.springframework.security.config.annotation.web.builders.WebSecurity.performBuild(WebSecurity.java:292)
	at org.springframework.security.config.annotation.web.builders.WebSecurity.performBuild(WebSecurity.java:79)
	at org.springframework.security.config.annotation.AbstractConfiguredSecurityBuilder.doBuild(AbstractConfiguredSecurityBuilder.java:333)
	at org.springframework.security.config.annotation.AbstractSecurityBuilder.build(AbstractSecurityBuilder.java:41)
	at org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration.springSecurityFilterChain(WebSecurityConfiguration.java:104)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154)
	... 27 common frames omitted

설정 내용. 

private void configureRememberMe(HttpSecurity http) throws Exception {
        http.rememberMe()
               .key(REMEMBERME_KEY)
               .rememberMeParameter(REMEMBERME_PARAMETER)
               .rememberMeCookieName(REMEMBERME_COOKIENAME)
               .rememberMeServices(persistentTokenBasedRememberMeServices())
               .tokenValiditySeconds(60 * 60 * 24 * 7)
               .alwaysRemember(true)
               .tokenRepository(rememberMeTokenRepository)
               .userDetailsService(rememberMeUserService);
	}


    @Bean
   	public PersistentTokenBasedRememberMeServices persistentTokenBasedRememberMeServices() {
   	    PersistentTokenBasedRememberMeServices persistenceTokenBasedservice = new PersistentTokenBasedRememberMeServices(REMEMBERME_KEY, userDetailsService(), rememberMeTokenRepository);
   	    persistenceTokenBasedservice.setParameter(REMEMBERME_PARAMETER);
   	    persistenceTokenBasedservice.setAlwaysRemember(false);
   	    persistenceTokenBasedservice.setCookieName(REMEMBERME_COOKIENAME);
   	    persistenceTokenBasedservice.setTokenValiditySeconds(60 * 60 * 24 * 7);		// 토큰 유효시간 1주일 설정
   	    return persistenceTokenBasedservice;
    }

원인 

.rememberMeCookieName(REMEMBERME_COOKIENAME)
.rememberMeServices(persistentTokenBasedRememberMeServices())

설정시 rememberMeServices로 할지 스프링 시큐리트를 가지고 할지를 선택해서 하나만 설정을 해야지 에러가 나지 않는다. 
둘다 하면 에러가 위와 같은 에러 발생. 

해결방안. 

rememberMeServices 또는 스프링 설정 둘중 하나를 선택해서 설정하면 해결완료. 

 

private void configureRememberMe(HttpSecurity http) throws Exception {
        http.rememberMe()
               .key(REMEMBERME_KEY)
               .rememberMeParameter(REMEMBERME_PARAMETER)
               .rememberMeCookieName(REMEMBERME_COOKIENAME)
               .alwaysRemember(true)
               .tokenValiditySeconds(60 * 60 * 24 * 7)
               .tokenRepository(tokenRepository())
               .userDetailsService(userDetailsService());
	}
    
    
  

에러 내용

muliple 프로젝트로 gradle를 사용하고 있는데 갑자기 "does not exist" 에러가 발생했다.

> Task :varsql-core:compileQuerydsl FAILED
F:\02.test\test\test-core\src\main\java\com\test\core\common\util\DataExportUtil.java:27: error: package com.varsql.core.common.constants does not exist
import com.varsql.core.common.constants.BlankConstants;


.....


FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':test-projecet:compileQuerydsl'.
> Compilation failed; see the compiler error output for details.

 

해결방안

기본 설정. 

	def querydslSrcDir = 'src/main/generated'

	querydsl {
	    library = "com.querydsl:querydsl-apt"
	    jpa = true
	    querydslSourcesDir = querydslSrcDir
	}
	
	compileQuerydsl{ // querydsl 컴파일시 사용하는 애노테이션프로세서('com.querydsl.apt.jpa.JPAAnnotationProcessor')의 경로를 querydsl 이 지정한 경로를 이용한다는 선언
	    options.annotationProcessorPath = configurations.querydsl
	}

	configurations {
	    querydsl.extendsFrom compileClasspath
	}

	sourceSets {
	    main {
	        java {
	            srcDirs = ['src/main/java', querydslSrcDir]
	        }
	    }
	}

해결 설정. 

def querydslSrcDir = 'src/main/generated'

	querydsl {
	    library = "com.querydsl:querydsl-apt"
	    jpa = true
	    querydslSourcesDir = querydslSrcDir
	}
	
	compileQuerydsl{ // querydsl 컴파일시 사용하는 애노테이션프로세서('com.querydsl.apt.jpa.JPAAnnotationProcessor')의 경로를 querydsl 이 지정한 경로를 이용한다는 선언
	    options.annotationProcessorPath = configurations.querydsl
	}

	configurations {
	    querydsl.extendsFrom compileClasspath
	}

	sourceSets {
	    main {
	        java {
	            srcDirs = ['src/main/java', querydslSrcDir]
	        }
	    }
	}
	// 이 부분이 추가. 
	tasks.withType(JavaCompile) {
	    options.annotationProcessorGeneratedSourcesDirectory = file(querydslSrcDir)
	}

 

에러 내용. 

elipse Markers에서 나오는 에러 내용. 

Description	Resource	Path	Location	Type
CHKJ3000E: WAR Validation Failed: org.eclipse.jst.j2ee.commonarchivecore.internal.exception.DeploymentDescriptorLoadException: WEB-INF/web.xml	dynamic-web		Unknown	Validation Message

 해결방법 : 

Project >Properties >Validation: Web (xxx) Validator 의 체크 박스 해제

이클립스 설정 방법

+ Recent posts