実装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番の権限が追加されていることを確認できます.

すべてのユーザーの情報がロードされると、次の方法でロールを追加およびインポートできる情報が表示されます.