Java/Spring
[Spring Security] 스프링 시큐리티 초기 세팅 및 로그인 권한 설정
ㅈㅣ니
2023. 7. 5. 15:31
오늘 수업내용 내가 알아보기 쉽게 정리.
1) 시큐리티가 필요한 URI 설계
- 게시판 글쓰기는 인증(로그인)해야만 사용가능
- 게시글 작성자는 인증받은 ID 로 사용가능
- 게시글 수정/삭제는 작성자 확인 후 가능
- 그 외는 인증받지 않아도 모두가 사용가능.
2) 시큐리티 개요
- 인증(Authentication)과 권한(==인가)(Authorization)
- 스프링 시큐리티 구조
시큐리티 개요 | |
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}을 추가해줬다.
이렇게 하면 이제 로그인을 할 수 있게 된다.
반응형