実装game login[1]api権限の追加
ソース
Spring Boot and Spring Security with JWT including Access and Refresh Tokens関連YouTube動画を参考に行いました!
💬なぜ修正しますか?
既存のコードはtokenのみを発行し,権限情報がなければ返す形式である.トークン接続のみを使用する方法でセキュリティの問題があるため、access tokenとrefresh tokenを使用して区別してみてください.
🔨Entityの変更 @Entity
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Table(name = "game_users")
public class GameUserEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long id;
@Column(name = "user_id", nullable = false, unique = true, length = 10)
private String userId;
@Column(nullable = false, length = 20)
private String name;
@Column(nullable = false, length = 150)
private String pw;
@ManyToMany(fetch = FetchType.EAGER)
private Collection<GameRole> roles = new ArrayList<>();
@CreationTimestamp
private LocalDateTime createdAt = LocalDateTime.now();
@Builder
public GameUserEntity(@NonNull String userId,@NonNull String name,@NonNull String pw) {
this.userId = userId;
this.name = name;
this.pw = pw;
}
}
権限ロールとして次のロールが追加され、ユーザー情報をロードするときに一緒に使用されるため、fetchポリシーをEAGERとして使用します.
参考までに、fetchポリシーEAGERはどこで使っても出血します.ユーザー・テーブルを選択すると、GameRoleテーブルを無条件にクエリーするポリシーがあるため、その後のクエリーの速度が非常に遅くなります.@Entity
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
public class GameRole {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
}
GameRoleコードpublic interface GameRoleRepository extends CrudRepository<GameRole, Long> {
GameRole findByName(String name);
}
将来使用するリポジトリの事前実装
よく現れています.
なお、ROLE ADMINはGAME ROLEテーブルに予め登録されている.@Service
@RequiredArgsConstructor
@Transactional
@Slf4j
public class GameUserServiceImpl implements GameUserService{
private final BCryptPasswordEncoder passwordEncoder;
private final GameUserRepository gameUserRepository;
private final GameRoleRepository gameRoleRepository;
@Override
public ResponseGameUser join(RequestGameUser requestGameUser) {
log.info("user join {}", requestGameUser.getName());
//유효성 검사
GameUserEntity user = gameUserRepository.findByUserId(requestGameUser.getUserId());
if(user != null){
throw new JoinException(UserCode.EXIST_USER);
}
GameUserEntity gameUserEntity = GameUserEntity.builder()
.userId(requestGameUser.getUserId())
.pw(passwordEncoder.encode(requestGameUser.getPw()))
.name(requestGameUser.getName())
.build();
GameUserEntity save = gameUserRepository.save(gameUserEntity);
addRoleToUser(save.getUserId(), "ROLE_ADMIN");
ResponseGameUser responseGameUser = new ResponseGameUser(save.getUserId());
return responseGameUser;
}
@Override
public GameRole saveRole(GameRole role) {
log.info("user save role {}",role.getName());
return gameRoleRepository.save(role);
}
@Override
public void addRoleToUser(String userId, String roleName) {
log.info("user add user = {}, role = {}",userId, roleName);
GameUserEntity user = gameUserRepository.findByUserId(userId);
GameRole role = gameRoleRepository.findByName(roleName);
user.getRoles().add(role);
}
@Override
public GameUserVo getUserDetailByUserId(String userId) {
log.info("getUserDetailByUserId {}",userId);
GameUserEntity userEntity = gameUserRepository.findByUserId(userId);
GameUserVo gameUserVo = GameUserVo.builder()
.userId(userEntity.getUserId())
.name(userEntity.getName())
.pw(userEntity.getPw())
.createdAt(userEntity.getCreatedAt())
.build();
return gameUserVo;
}
@Override
public List<GameUserEntity> getAllUser() {
return Lists.newArrayList(gameUserRepository.findAll());
}
@Override
public UserDetails loadUserByUsername(String userId) throws UsernameNotFoundException {
GameUserEntity user = gameUserRepository.findByUserId(userId);
if(user == null) throw new UsernameNotFoundException("user가 존재하지 않습니다.");
return new User(user.getUserId(), user.getPw(), true, true, true, true, new ArrayList<>());
}
}
既存のロジックにaddRoleToUser()メソッドを追加し、まずROLE ADMINのみを追加します.その後、会員登録時には全員がROLE ADMINを持ち、ROLE MANAGERやその他の権限の画面を作成して管理することもできるので、サービスで定義して使用します.
そして会員加入を行うと.
1番のアカウントに1番のキャラクターが追加されていることを確認して、もう1人の会員に加入することができます
2番のアカウントにも1番の権限が追加されていることを確認できます.
すべてのユーザーの情報がロードされると、次の方法でロールを追加およびインポートできる情報が表示されます.
Reference
この問題について(実装game login[1]api権限の追加), 我々は、より多くの情報をここで見つけました
https://velog.io/@ililil9482/game-login-구현하기-1
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
既存のコードはtokenのみを発行し,権限情報がなければ返す形式である.トークン接続のみを使用する方法でセキュリティの問題があるため、access tokenとrefresh tokenを使用して区別してみてください.
🔨Entityの変更 @Entity
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Table(name = "game_users")
public class GameUserEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long id;
@Column(name = "user_id", nullable = false, unique = true, length = 10)
private String userId;
@Column(nullable = false, length = 20)
private String name;
@Column(nullable = false, length = 150)
private String pw;
@ManyToMany(fetch = FetchType.EAGER)
private Collection<GameRole> roles = new ArrayList<>();
@CreationTimestamp
private LocalDateTime createdAt = LocalDateTime.now();
@Builder
public GameUserEntity(@NonNull String userId,@NonNull String name,@NonNull String pw) {
this.userId = userId;
this.name = name;
this.pw = pw;
}
}
権限ロールとして次のロールが追加され、ユーザー情報をロードするときに一緒に使用されるため、fetchポリシーをEAGERとして使用します.
参考までに、fetchポリシーEAGERはどこで使っても出血します.ユーザー・テーブルを選択すると、GameRoleテーブルを無条件にクエリーするポリシーがあるため、その後のクエリーの速度が非常に遅くなります.@Entity
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
public class GameRole {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
}
GameRoleコードpublic interface GameRoleRepository extends CrudRepository<GameRole, Long> {
GameRole findByName(String name);
}
将来使用するリポジトリの事前実装
よく現れています.
なお、ROLE ADMINはGAME ROLEテーブルに予め登録されている.@Service
@RequiredArgsConstructor
@Transactional
@Slf4j
public class GameUserServiceImpl implements GameUserService{
private final BCryptPasswordEncoder passwordEncoder;
private final GameUserRepository gameUserRepository;
private final GameRoleRepository gameRoleRepository;
@Override
public ResponseGameUser join(RequestGameUser requestGameUser) {
log.info("user join {}", requestGameUser.getName());
//유효성 검사
GameUserEntity user = gameUserRepository.findByUserId(requestGameUser.getUserId());
if(user != null){
throw new JoinException(UserCode.EXIST_USER);
}
GameUserEntity gameUserEntity = GameUserEntity.builder()
.userId(requestGameUser.getUserId())
.pw(passwordEncoder.encode(requestGameUser.getPw()))
.name(requestGameUser.getName())
.build();
GameUserEntity save = gameUserRepository.save(gameUserEntity);
addRoleToUser(save.getUserId(), "ROLE_ADMIN");
ResponseGameUser responseGameUser = new ResponseGameUser(save.getUserId());
return responseGameUser;
}
@Override
public GameRole saveRole(GameRole role) {
log.info("user save role {}",role.getName());
return gameRoleRepository.save(role);
}
@Override
public void addRoleToUser(String userId, String roleName) {
log.info("user add user = {}, role = {}",userId, roleName);
GameUserEntity user = gameUserRepository.findByUserId(userId);
GameRole role = gameRoleRepository.findByName(roleName);
user.getRoles().add(role);
}
@Override
public GameUserVo getUserDetailByUserId(String userId) {
log.info("getUserDetailByUserId {}",userId);
GameUserEntity userEntity = gameUserRepository.findByUserId(userId);
GameUserVo gameUserVo = GameUserVo.builder()
.userId(userEntity.getUserId())
.name(userEntity.getName())
.pw(userEntity.getPw())
.createdAt(userEntity.getCreatedAt())
.build();
return gameUserVo;
}
@Override
public List<GameUserEntity> getAllUser() {
return Lists.newArrayList(gameUserRepository.findAll());
}
@Override
public UserDetails loadUserByUsername(String userId) throws UsernameNotFoundException {
GameUserEntity user = gameUserRepository.findByUserId(userId);
if(user == null) throw new UsernameNotFoundException("user가 존재하지 않습니다.");
return new User(user.getUserId(), user.getPw(), true, true, true, true, new ArrayList<>());
}
}
既存のロジックにaddRoleToUser()メソッドを追加し、まずROLE ADMINのみを追加します.その後、会員登録時には全員がROLE ADMINを持ち、ROLE MANAGERやその他の権限の画面を作成して管理することもできるので、サービスで定義して使用します.
そして会員加入を行うと.
1番のアカウントに1番のキャラクターが追加されていることを確認して、もう1人の会員に加入することができます
2番のアカウントにも1番の権限が追加されていることを確認できます.
すべてのユーザーの情報がロードされると、次の方法でロールを追加およびインポートできる情報が表示されます.
Reference
この問題について(実装game login[1]api権限の追加), 我々は、より多くの情報をここで見つけました
https://velog.io/@ililil9482/game-login-구현하기-1
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Table(name = "game_users")
public class GameUserEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long id;
@Column(name = "user_id", nullable = false, unique = true, length = 10)
private String userId;
@Column(nullable = false, length = 20)
private String name;
@Column(nullable = false, length = 150)
private String pw;
@ManyToMany(fetch = FetchType.EAGER)
private Collection<GameRole> roles = new ArrayList<>();
@CreationTimestamp
private LocalDateTime createdAt = LocalDateTime.now();
@Builder
public GameUserEntity(@NonNull String userId,@NonNull String name,@NonNull String pw) {
this.userId = userId;
this.name = name;
this.pw = pw;
}
}
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
public class GameRole {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
}
public interface GameRoleRepository extends CrudRepository<GameRole, Long> {
GameRole findByName(String name);
}
@Service
@RequiredArgsConstructor
@Transactional
@Slf4j
public class GameUserServiceImpl implements GameUserService{
private final BCryptPasswordEncoder passwordEncoder;
private final GameUserRepository gameUserRepository;
private final GameRoleRepository gameRoleRepository;
@Override
public ResponseGameUser join(RequestGameUser requestGameUser) {
log.info("user join {}", requestGameUser.getName());
//유효성 검사
GameUserEntity user = gameUserRepository.findByUserId(requestGameUser.getUserId());
if(user != null){
throw new JoinException(UserCode.EXIST_USER);
}
GameUserEntity gameUserEntity = GameUserEntity.builder()
.userId(requestGameUser.getUserId())
.pw(passwordEncoder.encode(requestGameUser.getPw()))
.name(requestGameUser.getName())
.build();
GameUserEntity save = gameUserRepository.save(gameUserEntity);
addRoleToUser(save.getUserId(), "ROLE_ADMIN");
ResponseGameUser responseGameUser = new ResponseGameUser(save.getUserId());
return responseGameUser;
}
@Override
public GameRole saveRole(GameRole role) {
log.info("user save role {}",role.getName());
return gameRoleRepository.save(role);
}
@Override
public void addRoleToUser(String userId, String roleName) {
log.info("user add user = {}, role = {}",userId, roleName);
GameUserEntity user = gameUserRepository.findByUserId(userId);
GameRole role = gameRoleRepository.findByName(roleName);
user.getRoles().add(role);
}
@Override
public GameUserVo getUserDetailByUserId(String userId) {
log.info("getUserDetailByUserId {}",userId);
GameUserEntity userEntity = gameUserRepository.findByUserId(userId);
GameUserVo gameUserVo = GameUserVo.builder()
.userId(userEntity.getUserId())
.name(userEntity.getName())
.pw(userEntity.getPw())
.createdAt(userEntity.getCreatedAt())
.build();
return gameUserVo;
}
@Override
public List<GameUserEntity> getAllUser() {
return Lists.newArrayList(gameUserRepository.findAll());
}
@Override
public UserDetails loadUserByUsername(String userId) throws UsernameNotFoundException {
GameUserEntity user = gameUserRepository.findByUserId(userId);
if(user == null) throw new UsernameNotFoundException("user가 존재하지 않습니다.");
return new User(user.getUserId(), user.getPw(), true, true, true, true, new ArrayList<>());
}
}
Reference
この問題について(実装game login[1]api権限の追加), 我々は、より多くの情報をここで見つけました https://velog.io/@ililil9482/game-login-구현하기-1テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol