<스프링 시큐리티 복습 진행중 - PrincipalDetailsService.java>
package com.example.demo.auth; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; import com.example.demo.dao.UserDao; import com.example.demo.model.User; /* * 왜 굳이 Service계층을 따로 관리하는가? * 로그인 처리를 빼앗겼다 - 제어권이 스프링에게 있음 - IoC - 제어역전, 역제어 * 스프링 시큐리티 - filter chain - * 보안상 세션관리 따로 진행함 * Authentication은 UserDetails타입만 받아 준다 * <bean class="구현체클래스" type="추상클래스 or 인터페이스"/> */ @Service public class PrincipalDetailsService implements UserDetailsService { Logger logger = LogManager.getLogger(); @Autowired //제어권이 스프링 컨테이너에게 있다 - ApplicationContext - 영속성 private UserDao userDao = null; //loadUserByUsername메소드를 재정의해야 하기때문이다 @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { logger.info(username);//사용자가 입력한 이름 //User타입은 Authentication에 직접 담을 수 없음 //User타입을 UserDetails타입에 담아줌 User ruser = userDao.login(username); if(ruser !=null) { return new PrincipalDetails(ruser); } return null; } }
<스프링 시큐리티 복습 진행중 - PrincipalDetails.java>
package com.example.demo.auth; import java.util.ArrayList; import java.util.Collection; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; import com.example.demo.model.User; import lombok.Data; //여기에서 쥔 값을 세션에 담아야 함 @Data public class PrincipalDetails implements UserDetails { private static final long serialVersionUID = 1L; private User user; //일반 로그인시 사용하는 생성자 public PrincipalDetails(User user) { this.user = user; } //OAuth로그인시 사용하는 생성자 따로 정의함 //해당 User권한을 리턴하는 곳 @Override public Collection<? extends GrantedAuthority> getAuthorities() { Collection<GrantedAuthority> collect = new ArrayList<>(); collect.add(new GrantedAuthority() { @Override public String getAuthority() { return user.getRole(); } }); return collect; } //데이터베이스와 매칭이 안되면 로그인 실패 페이지 호출됨 @Override public String getPassword() { return user.getPassword(); } @Override public String getUsername() { return user.getUsername(); } //강제는 아니나 사용자가 세션에 담고 싶은 다른 컬럼정보도 등록이 가능함 public String getRole() { return user.getRole(); } public String getCreateDate() { return user.getCreateDate(); } @Override public boolean isAccountNonExpired() { return true; } @Override public boolean isAccountNonLocked() { return true; } @Override public boolean isCredentialsNonExpired() { return true; } @Override public boolean isEnabled() { // TODO Auto-generated method stub return true; } }
<스프링 시큐리티 복습 진행중 - HomeController.java>
package com.example.demo.controller; import javax.servlet.http.HttpSession; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.security.core.Authentication; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.oauth2.core.user.OAuth2User; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.ResponseBody; import com.example.demo.auth.PrincipalDetails; import com.example.demo.logic.UserLogic; import com.example.demo.model.User; @Controller public class HomeController { Logger logger = LogManager.getLogger(HomeController.class); @Autowired private UserLogic userLogic = null; @Autowired public BCryptPasswordEncoder bCryptPasswordEncoder = null; // user-123 admin-123 @GetMapping("/") public String index(Authentication authentication, HttpSession session) { logger.info("index"); PrincipalDetails principalDetails = null; if(authentication !=null) { principalDetails = (PrincipalDetails)authentication.getPrincipal(); logger.info(principalDetails.getUser()); logger.info(principalDetails.getUser().getId()); logger.info(principalDetails.getUser().getEmail()); logger.info(principalDetails.getUser().getCreateDate()); logger.info(principalDetails.getUser().getUsername()); logger.info(principalDetails.getUser().getPassword()); logger.info(principalDetails.getUser().getRole()); session.setAttribute("email", principalDetails.getUser().getEmail()); session.setAttribute("role", principalDetails.getUser().getRole()); } return "forward:index.jsp"; } // 로그인 화면 @GetMapping("/loginForm") public String loginForm() { logger.info("loginForm"); return "forward:loginForm.jsp"; } // 로그인 에러 화면 @GetMapping("/login-error") public String loginError() { logger.info("loginError"); return "forward:loginError.jsp"; } // 회원가입 화면 @GetMapping("/joinForm") public String joinForm() { logger.info("joinForm"); return "forward:joinForm.jsp"; } // 회원가입 @PostMapping("/join") public String join(User user) { logger.info("join"); int result = 0; // 등록 성공 유무 담기 user.setRole("ROLE_USER"); // 패스워드 암호화처리 String rawPassword = user.getPassword(); String encPassword = bCryptPasswordEncoder.encode(rawPassword); user.setPassword(encPassword); result = userLogic.memberInsert(user); return "forward:loginForm.jsp"; } // 유저 화면 @GetMapping("/user") public String userPage() { logger.info("userPage"); return "forward:user-index.jsp"; } // 관리자 화면 @GetMapping("/admin") public String adminPage() { logger.info("adminPage"); return "forward:admin-index.jsp"; } }
<스프링 시큐리티 복습 진행중 - UserDao.java>
package com.example.demo.dao; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.mybatis.spring.SqlSessionTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import com.example.demo.model.User; @Repository public class UserDao { Logger logger = LogManager.getLogger(UserDao.class); @Autowired private SqlSessionTemplate sqlSessionTemplate; public int memberInsert(User user) { logger.info("memberInsert"); int result = 0; result = sqlSessionTemplate.update("memberInsert", user); return result; } public User login(String username) { logger.info("login"); User user = null; user = sqlSessionTemplate.selectOne("login", username); return user;//PrincipalDetails에 담길 객체 } }
<스프링 시큐리티 복습 진행중 - member.xml>
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.example.demo"> <!-- 회원 정보 입력 --> <insert id="memberInsert" parameterType="map"> INSERT INTO member202210( id , username , password , email , role , createDate ) VALUES (SEQ_MEMBER202210_ID.nextval <if test="username != null"> ,#{username} </if> <if test="password != null"> ,#{password} </if> <if test="email != null"> ,#{email} </if> <if test="role != null"> ,#{role} </if> , to_char(sysdate, 'YYYY-MM-DD') ) </insert> <!-- 로그인 --> <select id="login" parameterType="string" resultType="com.example.demo.model.User"> SELECT id, username, password, role, email, createdate FROM member202210 WHERE username = #{value} </select> <!-- 목록 출력 --> <select id="memberList" parameterType="map" resultType="map"> select mem_uid, mem_name, mem_email ,mem_no, mem_nickname, mem_status, mem_auth from member230324 <where> <if test='mem_uid!=null and mem_uid.length()>0'> AND mem_uid = #{mem_uid} </if> <!-- <input type=text id="mem_nickname" value=""/> 항상 무조건 빈문자열이다. 폼전송하면 무조건 빈문자열이 있는 상태이다 너가 아무것도 입력하지 않아도 null에 걸리지 않는다 잡아내려면 문자열이 > 0 까지를 비교해야 잡아낼수 있다 --> <if test='MEM_NICKNAME!=null and MEM_NICKNAME.length()>0'> AND mem_nickname = #{MEM_NICKNAME} </if> <if test='mem_name!=null and mem_name.length()>0'> AND mem_name = #{mem_name} </if> <if test='mem_tel!=null and mem_tel.length()>0'> AND mem_tel = #{mem_tel} </if> </where> </select> </mapper>
<스프링 시큐리티 복습 진행중 - PrincipalOauth2UserService.java>
package com.example.demo.oauth; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.security.oauth2.client.userinfo.DefaultOAuth2UserService; import org.springframework.security.oauth2.client.userinfo.OAuth2UserRequest; import org.springframework.security.oauth2.core.OAuth2AuthenticationException; import org.springframework.security.oauth2.core.user.OAuth2User; import org.springframework.stereotype.Service; //구글로그인버튼 -> 구글로그인창 -> 로그인을 완료 -> 코드를 리턴 //AccessToken요청 -> loadUser호출 -> 구글 프로필정보 받음 @Service public class PrincipalOauth2UserService extends DefaultOAuth2UserService { Logger logger = LogManager.getLogger(PrincipalOauth2UserService.class); @Override public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException { logger.info(userRequest); logger.info("구글발급해준 토큰 : "+userRequest.getAccessToken().getTokenValue()); return super.loadUser(userRequest); } }
<스프링 시큐리티 복습 진행중 - MainController.java>
package com.example.demo.controller; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping("/main/*") public class MainController { Logger logger = LogManager.getLogger(MainController.class); @GetMapping("index") public String index() { logger.info("index"); return "redirect:index.jsp"; } }
'국비학원 > 수업기록' 카테고리의 다른 글
국비 지원 개발자 과정_Day104 (0) | 2023.04.27 |
---|---|
국비 지원 개발자 과정_Day103 (0) | 2023.04.26 |
국비 지원 개발자 과정_Day101 (0) | 2023.04.25 |
국비 지원 개발자 과정_Day100 (0) | 2023.04.21 |
국비 지원 개발자 과정_Day99 (0) | 2023.04.20 |
댓글