Java/Spring

[Spring Security] 스프링 시큐리티 초기 세팅 및 로그인 권한 설정

ㅈㅣ니 2023. 7. 5. 15:31

오늘 수업내용 내가 알아보기 쉽게 정리.

 

1) 시큐리티가 필요한 URI 설계

  • 게시판 글쓰기는 인증(로그인)해야만 사용가능
  • 게시글 작성자는 인증받은 ID 로 사용가능
  • 게시글 수정/삭제는 작성자 확인 후 가능
  • 그 외는 인증받지 않아도 모두가 사용가능.

2) 시큐리티 개요

  1. 인증(Authentication)과 권한(==인가)(Authorization)
  2. 스프링 시큐리티 구조
시큐리티 개요
AuthenticationManager - 인증관리자 가장 중요한 역할, 다양한 방식의 인증을 처리할 수 있도록 구조 설계됨. (인터페이스)
ProviderManager - 제공관리자 인증처리를 AuthenticationProvider 객체를 이용해서 처리를 위임하는 역할 (인터페이스)
AuthenticationProvider - 인증 제공자 실제 인증 작업을 진행(처리)하는 역할 (인터페이스)
UserDetailService - 사용자 상세 서비스 인증된 실제 사용자의 정보과 권한 정보를 처리해서 반환하는 객체 (인터페이스)

[실습]

[1] Spring Web Security 설정 - pom.xml

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-web</artifactId>
    <version>${org.springframework-version}</version>
</dependency>

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-config</artifactId>
    <version>${org.springframework-version}</version>
</dependency>

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-core</artifactId>
    <version>${org.springframework-version}</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-taglibs -->
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-taglibs</artifactId>
    <version>${org.springframework-version}</version>
</dependency>

이렇게 스프링 버전에 맞게 설정해줬다. (나는 현재 스프링 5버전 사용중이다.)

WEB-INF 안에 있는 security-context.xml 파일에 추가했음.

<security:http> 
	   <security:form-login/>  
</security:http>	
	
<security:authentication-manager> 
</security:authentication-manager>

 

web.xml

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/spring/root-context.xml
        /WEB-INF/spring/security-context.xml
    </param-value>
</context-param>
<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

 


 

security-context.xml

1) 접근 허용 정책

<security:intercept-url pattern="/customer/noticeReg.htm" access="isAuthenticated()"/>
<security:intercept-url pattern="/customer/noticeDel.htm" access="hasRole('ROLE_ADMIN')"/>
<security:intercept-url pattern="/**" access="permitAll"/>

2) 인메모리방식으로 사용자 계정 + 역할(권한)설정

<security:authentication-manager> 
    <security:authentication-provider>
        <security:user-service>
            <security:user name="hong" authorities="ROLE_USER" password="1234"/>
            <security:user name="admin" authorities="ROLE_USER, ROLE_MANAGER, ROLE_ADMIN" password="1234"/>
        </security:user-service>
    </security:authentication-provider>
</security:authentication-manager>

여기서 user hong은 user권한만 받았다.

로그인 한 사용자만 게시글을 쓸 수 있기 때문에 글쓰기를 누르면 로그인 페이지로 이동한다.

글쓰기를 눌렀더니 로그인페이지로 이동

-> 이 폼은 스프링 시큐리티에서 기본제공하는 폼이다. 

security-context.xml 안에

<security:form-login/> 태그로 인하여 저 위의 로그인 폼이 나오는거다!

 

로그인을 해보겠다....

두둥!

에러가 발생했다...ㅜㅜ

There is no PasswordEncoder mapped for the id "null"

원인은 padsswordEncode 설정 안해줘서 그런거임!

{noop}을 추가해줬다.

이렇게 하면 이제 로그인을 할 수 있게 된다.

반응형