본문 바로가기

카테고리 없음

수업내용_21/02/18

1. 스프링 시큐리티 로그인 페이지 커스텀 화, 404 에러 처리 방법

· 로그인 페이지와 404 에러 처리 이전에는 기본 설정인 login 페이지와 404 에러페이지를 반환하였지만,

  로그인 페이지 커스텀 화를 통해 설정해둔 경로로 이동하여 페이지를 출력한다.

· defualt로 login/loginForm으로 설정하였기 때문에 url을 컨트롤러에 전달하고 컨트롤러에서는 jsp를 반환한다.

 

<security-context.xml> user 객체가 userService 정보를 로딩

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
   <http>
      <intercept-url pattern="/security/all" access="permitAll" />
      <intercept-url pattern="/security/member" access="hasRole('ROLE_MEMBER')" />   
      <intercept-url pattern="/security/admin" access="hasRole('ROLE_ADMIN')" />   
      <!--로그인 페이지 커스텀 화    -->
      <form-login login-page="/login/loginForm"
                    default-target-url="/"
                   //로그인 성공  url /로 이동
                    authentication-failure-url="/login/loginForm?error"
                   //잘못입력한 경우 위의 url로 이동
                    username-parameter="id"
                    password-parameter="password" />
      
      <logout logout-url="/logout" logout-success-url="/" /> 
      
      <!--404 에러 처리, 잘못된 접근의 경우 아래의 page로 이동 -->
      <access-denied-handler error-page="/security/accessError"/>
   </http>
 
   <!-- provider --> 
   <authentication-manager>
      <authentication-provider> 
         <user-service> 
            <user name="member" password="{noop}member" authorities="ROLE_MEMBER" /> 
            <user name="manager" password="{noop}manager" authorities="ROLE_MEMBER" /> 
            <user name="admin" password="{noop}admin" authorities="ROLE_MEMBER, ROLE_ADMIN" /> 
         </user-service> 
      </authentication-provider>
   </authentication-manager>
</beans:beans>
cs

 

<HomeController.java>

1
2
3
4
5
6
7
8
9
10
11
@Controller
public class HomeController {
    private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
 
    @GetMapping("/login/loginForm")
    public String loginForm() {
      
      logger.info("Welcome Login Form!");
      return "login/loginForm";
    }     
}
cs

 

<loginForm. jsp>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 <body onload="document.f.id.focus();">
    <h3>아이디와 비밀번호를 입력해주세요.</h3>
    <c:url value="/login" var="loginUrl" />
    <p>${loginUrl}</p>
   <form:form name="f" action="${loginUrl}" method="POST">
       <c:if test="${param.error != null}">
           <p>아이디와 비밀번호가 잘못되었습니다.</p>
       </c:if>
       <c:if test="${param.logout != null}">
           <p>로그아웃 하였습니다.</p>
       </c:if>
    <p>
        <label for="username">아이디</label>
        <input type="text" id="id" name="id" />
    </p>
    <p>
        <label for="password">비밀번호</label>
        <input type="password" id="password" name="password"/>
    </p>
    <%-- <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" /> --%>
    <button type="submit" class="btn">로그인</button>
   </form:form>
 </body>
cs

 

<기본 login page>

 

<설정한 경로, loginForm.jsp>

2. DB와 연결시키기

· 전에는 user id와 pw를 직접 설정했지만 회원을 모두 작성할 수 없으므로, DB의 정보를 불러와 조회하는 방법을 사용해야 한다.

· DB에 저장 된 id와 pw를 불러오기 위해 dataSource 객체를 생성 해야하므로, root-context.xml 설정 필수!
· JdbcDaoImpl 객체를 생성하여, user-service의 쿼리문을 실행한다. (쿼리문 미표기 시 defualt로 설정된 쿼리문 실행)

· 유저홈을 클릭했을 때 마지막 url에 설정해 둔 /**에서 통과하지 못하고, user, admin의 권한이 없다면 로그인 페이지를 

  반환하고, admin으로 로그인 한 경우 DB에 저장된 id와 passward가 맞다면 유저홈 페이지를 반환한다.

 

<security-context.xml> 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
 
     <http auto-config="true" use-expressions="true">
        <intercept-url pattern="/login/loginForm" access="permitAll" />
        <intercept-url pattern="/" access="permitAll" />
        <intercept-url pattern="/admin/**" access="hasRole('ADMIN')" />
        <intercept-url pattern="/**" access="hasAnyRole('USER, ADMIN')" />
        
      <!--로그인 페이지 커스텀 화    -->
      <form-login login-page="/login/loginForm"
                    default-target-url="/"
                    authentication-failure-url="/login/loginForm?error"
                    username-parameter="id"
                    password-parameter="password" />
      
      <logout logout-url="/logout" logout-success-url="/" /> 
                
      <!-- 403 에러 처리 -->
      <access-denied-handler error-page="/login/accessDenied"/>      
   </http> 
   
   <beans:bean id="userDetailsService" class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl">
        <beans:property name="dataSource" ref="dataSource"/>
    </beans:bean> 
   
    <beans:bean id="customNoOpPasswordEncoder" class="edu.bit.ex.security.CustomNoOpPasswordEncoder"/>
   
<!-- provider --> 
   <authentication-manager>
      <authentication-provider>
      <password-encoder ref="customNoOpPasswordEncoder"/>  
      <jdbc-user-service 
               data-source-ref="dataSource"
               users-by-username-query="select username, password, enabled from users where username = ?"
               authorities-by-username-query="select username, authority from authorities where username = ?"
        /> 
      </authentication-provider>
   </authentication-manager>
</beans:beans>
cs

 

※연습문제

· emp table의 아이디를 ename으로, 비밀번호를 empno로 입력하였을 때 로그인이 이루어지고,
 직업이 매니저인 사람은 관리자, 유저홈 유입이 가능하고, 그 외에 사원은 유저홈만 유입 가능하도록 프로그래밍 할 것!

 

<security-context.xml>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
 
     <http auto-config="true" use-expressions="true">
        <intercept-url pattern="/login/loginForm" access="permitAll" />
        <intercept-url pattern="/" access="permitAll" />
        <intercept-url pattern="/admin/**" access="hasRole('ADMIN')" />
        <intercept-url pattern="/**" access="hasAnyRole('USER, ADMIN')" />
        
      <!--로그인 페이지 커스텀 화    -->
      <form-login login-page="/login/loginForm"
                    default-target-url="/"
                    authentication-failure-url="/login/loginForm?error"
                    username-parameter="id"
                    password-parameter="password" />
      
      <logout logout-url="/logout" logout-success-url="/" /> 
                
      <!-- 403 에러 처리 -->
      <access-denied-handler error-page="/login/accessDenied"/>      
   </http> 
   
   <beans:bean id="userDetailsService" class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl">
        <beans:property name="dataSource" ref="dataSource"/>
    </beans:bean> 
   
    <beans:bean id="customNoOpPasswordEncoder" class="edu.bit.ex.security.CustomNoOpPasswordEncoder"/>
   
<!-- provider --> 
 <authentication-manager>
      <authentication-provider>
      <password-encoder ref="customNoOpPasswordEncoder"/> 
         <jdbc-user-service 
               data-source-ref="dataSource"
               role-prefix=""
               users-by-username-query="select ename, empno, 1 from emp where ename = ?"
               authorities-by-username-query="select ename, case when job='MANAGER' then 'ROLE_ADMIN' else 'ROLE_USER' end as authority from emp where ename = ?"
           /> 
      </authentication-provider>
   </authentication-manager>
cs

 

 

<구현화면_BLAKE>

 

 

<구현화면_SMITH>