2017-10-19 7 views
0

私は変更できないOracleデータベースがあります。このデータベースでは、権限フィールドを持つユーザーテーブルがあります。多くのif文、コードの改善を避ける

CREATE TABLE USER (
    ID NUMBER(38,0), 
    LOGIN VARCHAR2(6 BYTE) NOT NULL ENABLE, 
    PASSWORD VARCHAR2(200 BYTE) NOT NULL ENABLE, 

    BOOK_READ NUMBER(1,0), 
    BOOK_UPD NUMBER(1,0), 
    R_READ NUMBER(1,0), 
    R_UPD NUMBER(1,0), 
    ... 
    ... 
) 

例えば:

book_read = 1; - means that user has authority 
book_upd = 0; - means that user he does not 
report_read = 1; 

を今私はこのようにチェックしています:

List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>(); 
if (user.getBook_read() == 1) { 
    authorities.add(new SimpleGrantedAuthority("ROLE_BOOK_READ")); 
} 
if (user.getBook_upd() == 1) { 
    authorities.add(new SimpleGrantedAuthority("ROLE_BOOK_UPD")); 
} 
if (user.getReport_read() == 1) { 
    authorities.add(new SimpleGrantedAuthority("ROLE_REPORT_READ")); 
} 

私は当局(約20の多くを持って、それらはすべてで別の列を持っています表)。誰かがコードを改善する方法を提案していますか?

+4

これはコードレビューに属すると思いますが、[マイグレーションチェックリスト](https://codereview.meta.stackexchange.com/a/1689/150216)を確認してください。 –

+0

try switch文 – imk

+0

多くの権限を持っている "*という意味ですか?幾つ?それらはどのように保存されますか?彼らはすべて 'USER'テーブル内の個々の列ですか?コードを改善する助けが必要な場合は、少なくとも関連性の高い情報を提供する必要があります。 – Andreas

答えて

1

今あなたが20 列データベース内権限、および20のフィールド、20のゲッターUser Modelオブジェクト、および20 セッターを持っているようだ、とあなたは20 ifを必要としますList<GrantedAuthority>を作成するステートメント

簡単にするために、私はModelオブジェクトとDAOから始めることをお勧めします。

柔軟性を向上させるために、20の権限でenumを作成し、データベースの列名とロール名を明示的に付けます。

public enum User_Authority { 
    BOOK_READ("BOOK_READ", "ROLE_BOOK_READ"), 
    BOOK_UPD ("BOOK_UPD" , "ROLE_BOOK_UPD"), 
    // more enums 

    // fields here 

    private User_Authority(String columnName, String roleName) { 
     // assign to fields here 
    } 

    // getters here 
} 

あなたUser Modelオブジェクトは、その後、ユーザーに付与されている当局格納するEnumSet<User_Authority>を使用することができます。

あなたの春のJDBCテンプレートは、このようにロジックを RowMapperを使用することができます

List<GrantedAuthority> authoritiesを構築するための

public final class UserRowMapper implements RowMapper<User> { 
    @Override 
    public User mapRow(ResultSet rs, int rowNum) { 
     User user = new User(); 
     // get other columns here 
     EnumSet<User_Authority> granted = EnumSet.noneOf(User_Authority.class); 
     for (User_Authority auth : User_Authority.values()) 
      if (rs.getInt(auth.getColumnName()) == 1) 
       granted.add(auth); 
     user.setAuthorities(granted); 
     return user; 
    } 
} 

コードは次のと同じくらい簡単です:

List<GrantedAuthority> authorities = new ArrayList<>(); 
for (User_Authority auth : user.getAuthorities()) 
    authorities.add(new SimpleGrantedAuthority(auth.getRoleName())); 

あなたが見ることができるように、ここでは、「繰返し」が20個ある場所が1つしかありません:enumの値です。

後でに関する詳細を追加する必要がある場合は、当然のユーザーテーブルに新しい列を追加し、あなただけのコードに2つの項目を追加する必要があります。

  • 指定されたSQL文のSELECT句に列を追加します。 JDBC JDBCテンプレートへの変換
  • 新しいenum値を追加します。

これはコードの大幅な単純化/改良です。

0

どの方法との間の関係とSimpleGrantedAuthority

public class RoleChecker 
{ 
    Function<User, Integer> roleCheckFunction; 
    SimpleGrantedAuthority theAuthority; 

    public RoleChecker(Function<User, Integer> roleCheckFunction, SimpleGrantedAuthority theAuthority) 
    {} 
} 

とループを使用してチェックを実行を格納するクラスの一覧を作成する方法について。

List<RoleChecker> roles = new ArrayList<>(); 
roles.add(new RoleChecker(User::getBook_read, new SimpleGrantedAuthority("ROLE_BOOK_READ"))); 
roles.add(new RoleChecker(User::getBook_upd, new SimpleGrantedAuthority("ROLE_BOOK_UPD"))); 
// .... 
for (RoleChecker check : roles) 
{ 
    if (check.roleCheckFunction.apply(user) == 1) 
     authorities.add(check.theAuthority); 
} 
関連する問題