Spring에서 RestController를 사용하면 URL 끝에 ".json"을 붙여주면 json 타입으로 리턴을 해준다.

하지만 기본값은 xml이여서 xml로 리턴이 되어진다. 이 기본값을 변경하려면 다음과 같이 해야 한다.


1. Controller에서 설정하기 - produces

Controller.java




2. XML에서 기본값을 변경하기 - ContentNegotiationManager

[1]의 문서를 보면 defaultContentType만 설정해주면 되는것 같은데, 나는 도저히 기본값이 적용이 되지 않았다.

그래서 원하는 확장자를 별도로 선언해서 사용하니까 잘 적용이 되었다.


servlet-context.xml



Reference

[1] Content Negotiation using Spring MVC (https://spring.io/blog/2013/05/11/content-negotiation-using-spring-mvc)

[2] Chapter16. 스프링 MVC로 REST API 사용하기 (https://rebeccacho.gitbooks.io/spring-study-group/content/chapter16.html)



저작자 표시 비영리 변경 금지
신고

Leave a Comment

다국 언어 선택할 때 많이 사용하는 스프링 메시지이다.

세션을 많이 사용하겠지만 쿠키 형태로 정보를 저장할 때의 설정이다.

필요한 정보만 간단히 모아보았다.

언어 변경은 LocaleChangeInterceptor을 통해서 할 수 있게 설정했다.


applicationContext.xml


servlet-context.xml


message.jsp


저작자 표시 비영리 변경 금지
신고

Leave a Comment

Spring에서 webjars 적용하는 방법

Maven Repository나 다른 곳에서 webjars를 검색한다.

pom.xml에 추가한다.


pom.xml



servlet-context에 주소를 매핑한다.


servlet-context.xml


Java configuration을 사용할 경우에는 아래와 같이 설정한다.


WebConfig.java



JSP에서 호출한다.

Example1)

http://localhost/webjars/jquery/3.1.1-1/jquery.min.js

http://localhost/webjars/jqgrid/4.7.0/css/ui.jqgrid.css


Example2)




Reference

[1] [블로그개발_06] webjars를 이용한 bootstrap, jquery 적용해보기 (Spring Boot) (http://millky.com/@origoni/post/1147?language=ko_kr)

[2] 허니몬의 자바 | webjars란 무엇인가? (http://java.ihoney.pe.kr/428)


저작자 표시 비영리 변경 금지
신고

Leave a Comment

Spring Security를 커스터마이징하기 위해서는 그리고 이해하기 위해서는 아래 필터 체인을 이해하는 것이 좋다.

아래 그림은 인터넷에 돌아다니는 Spring Security 호출 그림을 내가 다시 깔끔하게 그려본 것이다.




Table 3.1. Standard Filter Aliases and Ordering
(https://docs.spring.io/spring-security/site/docs/3.1.x/reference/ns-config.html)


AliasFilter ClassNamespace Element or Attribute
CHANNEL_FILTERChannelProcessingFilterhttp/
intercept-url
@requires-channel
SECURITY_CONTEXT_FILTERSecurityContextPersistenceFilterhttp
CONCURRENT_SESSION_FILTERConcurrentSessionFiltersession-management/
concurrency-control
LOGOUT_FILTERLogoutFilterhttp/logout
X509_FILTERX509AuthenticationFilterhttp/x509
PRE_AUTH_FILTERAstractPreAuthenticatedProcessingFilter SubclassesN/A
CAS_FILTERCasAuthenticationFilterN/A
FORM_LOGIN_FILTERUsernamePasswordAuthenticationFilterhttp/form-login
BASIC_AUTH_FILTERBasicAuthenticationFilterhttp/http-basic
SERVLET_API_SUPPORT_FILTERSecurityContextHolderAwareRequestFilterhttp/
@servlet-api-provision
JAAS_API_SUPPORT_FILTERJaasApiIntegrationFilterhttp/
@jaas-api-provision
REMEMBER_ME_FILTERRememberMeAuthenticationFilterhttp/remember-me
ANONYMOUS_FILTERAnonymousAuthenticationFilterhttp/anonymous
SESSION_MANAGEMENT_FILTERSessionManagementFiltersession-management
EXCEPTION_TRANSLATION_FILTERExceptionTranslationFilterhttp
FILTER_SECURITY_INTERCEPTORFilterSecurityInterceptorhttp
SWITCH_USER_FILTERSwitchUserFilterN/A



API Document

- Spring Security 3.1.7 API Docs

Spring Javadocs 3.1.7

Spring Javadocs Current


- Spring Security Filter Chain

Spring Javadocs 3.1.x

Spring Javadocs Current


Filter Class

- SecurityContextPersistenceFilter

Spring Javadocs 3.1.7

Spring Javadocs Current


- LogoutFilter

Spring Javadocs 3.1.7

Spring Javadocs Current


UsernamePasswordAuthenticationFilter

Spring Javadocs 3.1.7

Spring Javadocs Current


DefaultLoginPageGeneratingFilter

Spring Javadocs 3.1.7

Spring Javadocs Current


BasicAuthenticationFilter

Spring Javadocs 3.1.7

Spring Javadocs Current


- RememberMeAuthenticationFilter

Spring Javadocs 3.1.7

Spring Javadocs Current


- SecurityContextHolderAwareRequestFilter

Spring Javadocs 3.1.7

Spring Javadocs Current


- AnonymousAuthenticationFilter

Spring Javadocs 3.1.7

Spring Javadocs Current


- SessionManagementFilter

Spring Javadocs 3.1.7

Spring Javadocs Current


- ExceptionTranslationFilter

Spring Javadocs 3.1.7

Spring Javadocs Current


- FilterSecurityInterceptor

Spring Javadocs 3.1.7

Spring Javadocs Current



Authentication class

- SecurityContextHolder

Spring Javadocs 3.1.7

Spring Javadocs Current



Authentication interface

- SecurityContextRepository

Spring Javadocs 3.1.7

Spring Javadocs 3.1.7


- SecurityContext

Spring Javadocs 3.1.7

Spring Javadocs Current


- LogoutSuccessHandler

Spring Javadocs 3.1.7

Spring Javadocs Current


- Authentication

Spring Javadocs 3.1.7

Spring Javadocs Current


- AuthenticationManager

Spring Javadocs 3.1.7

Spring Javadocs Current


- AuthenticationProvider

Spring Javadocs 3.1.7

Spring Javadocs Current


- UserDetails

Spring Javadocs 3.1.7

Spring Javadocs Current


- AuthenticationSuccessHandler

Spring Javadocs .3.1.7

Spring Javadocs .Current


- UserDetailService

Spring Javadocs 3.1.7

Spring Javadocs Current


- GrantedAuthority

Spring Javadocs 3.1.7

Spring Javadocs Current


- AuthenticationFailureHandler

Spring Javadocs 3.1.7

Spring Javadocs Current


- SessionAuthenticationStrategy

Spring javadocs 3.1.7

Spring javadocs Current


- SessionRegistry

Spring javadocs 3.1.7

Spring javadocs Current


- RequestCache

Spring Javadocs 3.1.7

Spring Javadocs Current




Authorization interface

- AuthenticationEntryPoint

Spring Javadocs 3.1.7

Spring Javadocs Current


- AccessDeniedHandler

Spring javadocs 3.1.7

Spring javadocs Current


- AccessDecisionManager

Spring Javadocs 3.1.7

Spring Javadocs Current


- AccessDecisionVoter

Spring Javadocs 3.1.7

Spring Javadocs Current


- SecurityMetadataSource

Spring Javadocs 3.1.7

Spring Javadocs Current




Authorization class

- AffirmativeBased

implemented : AccessDecisionManager

Spring Javadocs 3.1.7

Spring Javadocs Current


- RoleVoter

implemented : AccessDecisionVoter

Spring Javadocs 3.1.7

Spring Javadocs Current


- AuthenticationVoter

- DefaultMethodSecurityExpressionHandler 

implemented : MethodSecurityExpressionHandler, SecurityExpressionHandler

Spring Javadocs 3.1.7

Spring Javadocs Current


- AbstractAuthenticationToken 

implemented : Authentication

Spring Javadocs 3.1.7

Spring Javadocs Current

github java source


- AnonymousAuthenticationToken 

implemented : Authentication

Spring Javadocs 3.1.7

Spring Javadocs Current

github java source


- UsernamePasswordAuthenticationToken 

implemented : Authentication

Spring Javadocs 3.1.7

Spring Javadocs Current

github java source




저작자 표시 비영리 변경 금지
신고

Leave a Comment

SpringSecurity를 설정하다보니 Method레벨(global-method-security)에서의 AccessDeniedException은 그 전에 설정해놓은 <access-denied-handler>에 걸리지 않는 것을 알게 되었다.


왜 그런가 찾다보니 스택오버플로우[1]에서 답을 찾았는데

내 상황이 답을 준것처럼 처리하기에는 정확히 맞지 않는 상황이었다.


- StackOverFlow 번역 -

access-denied-handler는 AccessDeniedException가 발생할 때 ExceptionTranslationFilter에 의해 사용됩니다.

그러나 org.springframework.web.servlet.DispatcherServlet은 먼저 예외 처리를 시도했다.

특히 defaultErrorView로 정의 된 org.springframework.web.servlet.handler.SimpleMappingExceptionResolver가 있는데, 결과적으로 SimpleMappingExceptionResolver는 적절한 뷰로 리디렉션하여 예외를 소비하므로 결과적으로 ExceptionTranslationFilter에 버블링 될 예외가 없습니다.


수정은 간단했다. 모든 AccessDeniedException을 무시하도록 SimpleMappingExceptionResolver를 구성하십시오.


applicationContext.xml


이제는 AccessDeniedException이 발생할 때마다 SimpleMappingExceptionResolver를 무시하고 ExceptionTranslationFilter를 통해 예외 처리를 하게 됩니다.



- 내 해결 방식 -

내 프로젝트에서는 위와 같이 설정하기 난해한 부분이 있어서 중복이여서 아쉽지만 web.xml에 이동 페이지를 설정하게 해주었다.


web.xml



Reference

[1] Spring Security ignoring access-denied-handler with Method Level Security (http://stackoverflow.com/questions/21171882/spring-security-ignoring-access-denied-handler-with-method-level-security)



저작자 표시 비영리 변경 금지
신고

Leave a Comment

간단하지만 생각보다 어려운 설정 문제로 인해서 한참 고생을 했다.

Spring Security에서 기존에 있는 공통 Expression 외에 별도의 Expression을 만드려고 했는데 이게 제대로 문서도 없고 관련 예제가 있는 곳도 없다.

결국 구글링으로 만들긴 만들었다만 이 간단한 커스텀 개발을 위해서 쓴 시간이 아깝긴 하다. 막상 만들고 보니 고민거리가 있어서 실제로 쓸지도 모르겠다.


이 부분을 위해서 삽질하는 분들에게 도움이 되길 바란다.

우선 custom expression에는 2가지 종류가 있다.

메서드단에 설정하는 MethodSecurityExpression과 웹쪽에 설정하는 WebSecurityExpression이 있다. 이것을 몰라서 Method만 갖고 한참 삽질을 했다.

MethodSecurityExpression은 관련 클래스나 용어로 찾다보면 자료가 많이 있다. WebSecurityExpression이 별로 없다.





Version

  • 3.1.7을 기준으로 함
  • 3.0.7을 사용하다가 DefaultWebSecurityExpressionHandler을 상속받아서 사용할 때 원하는 메서드가 없어서 3.1.7로 올려서 사용하게 되었음
  • 3.1.7의 경우 Spring 3.0.7 Version에 대해 의존하고 있어서 다행히 문제되지 않음 ([4] 참조)



MethodSecurityExpression

  • 관련 클래스
    • DefaultMethodSecurityExpressionHandler
    • SecurityExpressionRoot
    • MethodSecurityExpressionOperations
  • 메소드쪽에 제한 설정
  • @PreAuthorize와 함께 사용



WebSecurityExpression

  • 관련 클래스
    • WebSecurityExpressionRoot
    • DefaultWebSecurityExpressionHandler
  • 웹쪽(xml or java config)에 설정
  • http intercept-url access에 설정



spring-security.xml (3.0.7의 경우)

SpringSecurity 3.0 에서는 XML 태그를 통해 웹 전반에 관한 expressionHandler 설정이 불가능

(SEC-1452 버그 참조. 3.1부터 가능.)

access-decision-manager-ref를 지정함으로써만 가능 (권남 블로그 참조)




spring-security.xml (3.1.7의 경우)



CustomWebSecurityExpressionHandler.java



CustomSecurityExpressionRoot.java




기타 참고 소스 1 - CustomMethodSecurityExpression


CustomMethodSecurityExpressionHandler.java


CustomMethodSecurityExpressionRoot.java


기타 참고 소스 2 - CustomAuthenticationToken


CustomAuthenticationToken.java


SampleCode - JaasGrandtedAuthority(3.1.7 사용 가능), SimpleGrantedAuthority(상위 버전)를 사용하거나 GrantedAuthority를 직접 구현해서 사용



Reference

[1]  16. Expression-Based Access Control (http://docs.spring.io/autorepo/docs/spring-security/3.1.x/reference/el-access.html)
[2] 권남 Spring Security (http://kwonnam.pe.kr/wiki/springframework/security)

[3] Github 참고 소스 (https://gist.github.com/bmchild/1642655)

[4] Maven Repository - spring security 3.1.7 (http://mvnrepository.com/artifact/org.springframework.security/spring-security-core/3.1.7.RELEASE)





저작자 표시 비영리 변경 금지
신고

Leave a Comment



Spring Security Reference

- Spring Security reference 3.2.10

http://docs.spring.io/spring-security/site/docs/3.2.10.RELEASE/reference/htmlsingle/html5/#what-is-acegi-security


- Hello world guide

http://docs.spring.io/spring-security/site/docs/current/guides/html5/helloworld-xml.html


- spring boot security

http://kielczewski.eu/2014/12/spring-boot-security-application/



SlideShare

- 해외 자료 (정리 잘 되어있음)

http://www.slideshare.net/analizator/spring-security-framework?qid=98031a91-6128-48f5-a8c9-fb1fda0fd93c&v=&b=&from_search=1


- 최범균님 자료 (강력 추천, 전반적인 개념 설명)

http://www.slideshare.net/madvirus/ss-36809454


- 아라한사님 자료 (예제가 상당히 좋음)

http://www.slideshare.net/meadunhansa/ss-53303729



Blog & etc

- 전반적인 스프링 시큐리티 설명과 좋은 예제를 제공

http://okky.kr/article/260408

http://zgundam.tistory.com/44


- 스프링 시큐리티 개념 & 용어 설명

http://egloos.zum.com/springmvc/v/504862


- 어떤 기술사분께서 정리한 자료, 초보자가 보기에는 좋지 않으나 핵심 그림 및 자료가 잘 정리되어 있어서 가끔 참고하기 좋음

http://www.sw-eng.kr/member/customer/Webzine/BoardView.do?

boardId=00000000000000038651&currPage=&searchPrefaceId=&titOrder=&writeOrder=&regDtOrder=&searchCondition=TOT&searchKeyword=


- Whiteship님의 총정리

http://whiteship.tistory.com/1632


기타 용어 정리

  • permission
    • 허락, 허가, 승인
    • Spring Security에서는 Authority가 유사한 형태
    • Spring security에서 쓰이는 용어는 아니지만 개념 차이를 위해 적음
  • authority
    • 권한, 재가, 인가
  • authentication
    • 입증, 증명, 인증
  • Role
    • Authority 모음 (Spring Security에서)
  • Authorization
    • 권한 부여 
  • principle(프린시플)
    • 아이디 (Spring Security에서의 뜻)
    • 원래 뜻 : 원리, 원칙, 법칙, 주의, 신조
  • Credential(크리덴셜)
    • 비밀번호 (Spring Security에서의 뜻)
    • 원래 뜻 : (사람 등의) 자질, 자격; (대사, 외교 사절 등의) 신임장
  • 부여된 권한(Granted Autority) 
  • 리소스의 권한(Intercept) 




저작자 표시 비영리 변경 금지
신고

Leave a Comment



아래와 같이 사용을 하려했지만 Deprecated 되었다.


 @JsonSerialize(include=JsonSerialize.Inclusion.NON_DEFAULT)


찾아보니 2. 대에서 사용법이 바뀐듯한데

아래와 같이 사용을 하면 된다.


mapper.setSerializationInclusion(Include.NON_NULL);


또는


@JsonInclude(Include.NON_NULL)
class Foo
{
  String bar;
}



저작자 표시 비영리 변경 금지
신고

Leave a Comment

개발 도중 이상한 에러와 직면했다.

분명 무결성 제약 조건에 걸릴 일이 없는데 자꾸 무결성 제약 조건 에러가 나는 것이었다.

별거 아닌데, 1시간을 넘게 에러를 찾게 되었고, 결과는 역시 JPA에 대한 사용 미숙이었다.



  Caused by: java.sql.SQLIntegrityConstraintViolationException: ORA-00001: 무결성 제약 조건(***.*****)에 위배됩니다


  Caused by: org.hibernate.exception.ConstraintViolationException: could not execute statement


  org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [***.*****];

  nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement 



내가 Entity 클래스를 만들 때,

숫자형 키값을 가지는 부분에 대한 변수 타입으로 long을 선언했다.

그런데 키값을 이렇게 하면 무엇이 문제인지는 모르겠으나 문제가 있는것으로 보인다.

해당 변수 타입을 Long으로 변경을 해주니 정상적으로 작동하며 문제가 해결되었다.



저작자 표시 비영리 변경 금지
신고

Leave a Comment

Spring에서 자주 하는 component-scan에 대한 설정이다.
이것을 왜 하는지 모르는 사람도 많이 보았다. servlet-context에 전체 스캔을 다 해버리고 한 곳에서 잘 되는데 왜 이것을 이렇게 설정을 해두었냐는 사람도 보았다. (물론 그렇게 해도 동작은 잘 하지만..... )
서블릿과 애플리케이션에 대한 분리는 인터넷이나 책에서 찾아서 공부를 하길 권장한다. ([1] 참조)

아래 xml을 보면 중요한 점은 디폴트 필터의 적용 여부와 include, exclude에 대한 차이이다.
디폴트 필터는 기본적으로 true인데, true일 경우 Repository, Component, Service, Controller등에 대한 모든 annotation에 대한 객체를 생성해버린다. 그래서 servlet에서는 이 설정을 끄고 Controller 객체에 대해서만 생성을 하도록 include 설정을 해놓았다.

application-context의 경우는 모든 객체에 대해 생성을 해야하므로 기본 필터를 사용하지만 controller에 대해서는 제외해야 하므로 controller를 exclude를 사용하였다.

* servlet-context.xml



* application-context.xml



Reference

[1] 스프링에서 말하는 서블릿 애플리케이션 컨텍스트가 서블릿 컨텍스트인가요? (https://slipp.net/questions/166)

저작자 표시 비영리 변경 금지
신고

Leave a Comment


to Top

티스토리 툴바