ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] spring boot security - login 만들기
    Study/Java 2020. 7. 5. 20:35

    pom.xml

    1
    2
    3
    4
    5
    <!-- security -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-security</artifactId>
            </dependency>
    cs

    Maven에 들어가서 spring boot security 검색하여 원하는 버젼 다운

    http:s//mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-security

     

    Maven Repository: org.springframework.boot » spring-boot-starter-security

    Starter for using Spring Security VersionRepositoryUsagesDate2.3.x2.3.1.RELEASECentral22Jun, 20202.3.0.RELEASECentral46May, 20202.2.x2.2.8.RELEASECentral2Jun, 20202.2.7.RELEASECentral29May, 20202.2.6.RELEASECentral46Mar, 20202.2.5.RELEASECentral44Feb, 2020

    mvnrepository.com

    LoginController.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    package simple.login;
     
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
     
    @Controller
    public class LoginController {
     
        @RequestMapping(value="/login", method = RequestMethod.GET)
        public String indexWindow(Model model) {
            
            return "login/login";
        }
     
    }
    cs

     

    SpringSecurityConfig.java

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    package simple.configuration;
     
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
    import org.springframework.security.config.annotation.authentication.configuration.EnableGlobalAuthentication;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.builders.WebSecurity;
    import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
     
    @Configuration
    @EnableWebSecurity
    @EnableGlobalAuthentication
    public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
        
        @Autowired
        private AuthProvider authProvider;
        @Autowired
        private LoginHandler loginHandler;
        
        // 스프링 시큐리티의 필터 연결 설정
        @Override
        public void configure(WebSecurity web) throws Exception {
            web.ignoring().antMatchers("/resources/**");
        }
        
        // 인터셉터로 요청을 안전하게 보호하는 방법 설정
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.csrf().disable()
            .authorizeRequests()
            .antMatchers("/login").permitAll()
            .antMatchers("/**").hasRole("USER")
            .and()
            .formLogin().loginPage("/login").permitAll().loginProcessingUrl("/login")
            .usernameParameter("userId").passwordParameter("passwd")
            .successHandler(loginHandler)
            .failureHandler(loginHandler).permitAll()
            .and()
            .logout().logoutUrl("/logout").logoutSuccessHandler(loginHandler).invalidateHttpSession(true).permitAll();
            
        }
        
        // 사용자 세부 서비스 설정
        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
            auth.authenticationProvider(authProvider);
        }
        
        
    }
     
    cs

    Interface WebSecurityConfigurer<T extends SecurityBuilder<javax.servlet.Filter>>

    https://docs.spring.io/spring-security/site/docs/4.0.x/apidocs/org/springframework/security/config/annotation/web/WebSecurityConfigurer.html

     

    WebSecurityConfigurerAdapter

    => Adapter는 implements한 인터페이스를 모두 오버라이드 한 클래스

    => 메소드를 부분만 사용할 수 있게 만들어 놓은 클래스임

    => Adapter를 extends하면 사용할 클래스만 extends하면 됨

     

    AuthProvider.java

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    package simple.configuration;
     
    import java.util.ArrayList;
    import java.util.List;
     
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.security.authentication.AuthenticationProvider;
    import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
    import org.springframework.security.core.Authentication;
    import org.springframework.security.core.AuthenticationException;
    import org.springframework.security.core.GrantedAuthority;
    import org.springframework.security.core.authority.SimpleGrantedAuthority;
    import org.springframework.security.crypto.password.PasswordEncoder;
    import org.springframework.security.web.session.HttpSessionEventPublisher;
    import org.springframework.stereotype.Component;
     
    import simple.user.UserService;
    import simple.user.UserVo;
     
    @Component
    public class AuthProvider implements AuthenticationProvider {
     
        @Autowired
        private UserService userService;
     
        @Override
        public Authentication authenticate(Authentication authentication) throws AuthenticationException {
            
            String userIdInput = authentication.getName();
            String passwdInput = (String) authentication.getCredentials();
            
            UsernamePasswordAuthenticationToken token;
            
            UserVo userVo = userService.selectUserOne(new UserVo(userIdInput));
     
            if ( userVo != null && userVo.getPasswd().equals(passwdInput) ) {
                List<GrantedAuthority> roles = new ArrayList<GrantedAuthority>();
                roles.add(new SimpleGrantedAuthority("USER"));
                
                token = new UsernamePasswordAuthenticationToken(authentication.getPrincipal(), authentication.getCredentials(), roles);
                token.setDetails(userVo);
                
                return token;
            }
            else {
                return null;
            }
            
        }
     
        @Override
        public boolean supports(Class<?> authentication) {
            return authentication.equals(UsernamePasswordAuthenticationToken.class);
        }
     
    }
     
    cs

     

    LoginHandler.java

    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
    39
    40
    41
    42
    43
    44
    45
    package simple.configuration;
     
    import java.io.IOException;
     
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
     
    import org.springframework.security.core.Authentication;
    import org.springframework.security.core.AuthenticationException;
    import org.springframework.security.web.authentication.AuthenticationFailureHandler;
    import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
    import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;
    import org.springframework.stereotype.Component;
     
    import simple.user.UserVo;
     
    @Component
    public class LoginHandler implements AuthenticationSuccessHandler, AuthenticationFailureHandler, LogoutSuccessHandler {
     
        @Override
        public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
            UserVo userVo = (UserVo) authentication.getDetails();
            
            request.getSession().setAttribute("userVo"new UserVo());
            response.sendRedirect("/user/indexWindow");
            
            System.out.println("로그인 성공");
        }
        
        @Override
        public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
            response.sendRedirect("/login");
            
            System.out.println("로그인 실패");
        }
     
        @Override
        public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
            request.getSession().invalidate();
            response.sendRedirect("/login");
        }
     
    }
     
    cs

     

    login.jsp

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
        <title>Insert title here</title>
        <link rel="stylesheet" href="/resources/lib/jqWidgets/styles/jqx.base.css" type="text/css" />
        <script type="text/javascript" src="/resources/lib/jquery/jquery-3.4.1.min.js"></script>
        <script type="text/javascript" src="/resources/lib/jqWidgets/jqx-all.js"></script>
        <style>
        body {
            width: 100%;
            height: 600px;
            background: #fff;
            margin: 0 auto;
            display: table;
        }
        #loginContent {
            display: table-cell;
            text-align: center;
            vertical-align: middle;
        }
        #loginForm {
            width: 400px;
            display: inline-block; 
        }
        </style>
        <script type="text/javascript">
        $(function() {
            initComponent();
        });
        
        function initComponent() {
            var template = [
                {bind:'userId'name:'userId', type:'text', label:'아이디', required:true, labelWidth:'80px', width:'250px', height: '25px'}
                , {bind:'passwd'name'passwd', type:'password', label:'비밀번호', required:true, labelWidth:'80px', width:'250px'}
            ];
            
            $('#loginForm').jqxForm({
                template: template,
                padding: { left: 10, top: 10, right: 10, bottom: 10 }
            });
            
            $("#loginBtn").jqxButton({ width: '100', height: '25', value:'로그인'});
            $("#loginBtn").on('click'function() {
                $('#loginForm').jqxForm('submit'"/login"null'POST');
            });
        }
        </script>
    </head>
    <body>
        <div id="loginContent">
            <div id="loginForm">
            </div>
            <div style="width: 100%; text-align: center;">
                <div style="display: inline-block; text-align: center; margin-top:10px;">
                    <input type="button" id="loginBtn" />
                </div>
            </div>
        </div>
    </body>
    </html>
    cs

    실행결과

Designed by Tistory.