2016-08-09 6 views
1

Spring MVCとHibernateを使用してWebアプリケーションを開発しています。ここでユーザーがシステムにログインして内部ページにアクセスします。これは、セッション変数をチェックするインターセプタを使用して行われます。ログインと登録にBeanを使用する - Spring MVC + Hibernate

有効な値を探して正しく登録することができます。 しかし、私はユーザー名とパスワードが必要なログインの場合、電子メールがないなどの理由で、Beanの検証を使用してログインする方法に問題があります。

これは、Userクラスです:

@Entity 
public class User{ 


    @Id 
    @GeneratedValue 
    private int id; 
    @NotNull 
    @Column(name="username",unique=true) 
    @Size(min=5) 
    private String username; 
    @NotNull 
    @Email 
    private String email; 
    @NotNull 
    @Size(min=5) 
    private String password; 
    private String salt; 
    private int status; 
    private String name; 
    private String company; 
    private int countryid; 
    @DateTimeFormat(pattern="dd/MM/yyyy") 
    @Temporal(TemporalType.DATE) 
    private Calendar subscriptionDate; 
//Getters and Setters 
} 

コントローラー:

@Transactional 
@Controller 
public class LoginController { 

    @Autowired 
    UserDao dao; 

    // Other Mappings 

    @RequestMapping(value = "addUser", method = RequestMethod.POST) 
     public String makeRegistration(@ModelAttribute("user") @Valid User user, BindingResult result, 
       RedirectAttributes redirectAttributes) { 
      if (result.hasErrors()) { 
       return "redirect:register"; 
      } 
      if (dao.add(user)) { 
       redirectAttributes.addFlashAttribute("user", user); 
       return "redirect:login"; 
      } else { 
       return "redirect:register"; 
      } 

     } 

     @RequestMapping(value = "enter", method = RequestMethod.POST) 
     public String doLogin(@ModelAttribute("user") @Valid User user, BindingResult result, HttpSession session) { 
      if (result.hasErrors()) { 
       return "redirect:login"; 
      } else { 
       if (dao.authenticate(user)) { 
        session.setAttribute("userLoggedIn", user.getUsername()); 
        return "forward:index"; 
       } else { 
        return "redirect:login"; 
       } 
      } 

     } 

    \\ Other mappings. 

はどのようにしてログインし、登録の両方のために "ユーザー" クラスを使用することができますか? 継承を使用する必要がありますか?

答えて

1

確かに継承ではありません! データ構造の役割について考えてみましょう。ログインフォームをバックアップするには何が必要ですか?まあ、単にLoginFormです。永続的なデータですか?絶対違う。 LoginFormUserの関係は何ですか?さて、最初のものは最後のものを特定するのに役立ちます。今私があなたがすべきだと思うのは、妥当性検査の要件を持つLoginFormオブジェクトを開発することです。このオブジェクトは永続的ではありませんが、独自の検証を持つ永続的なUserの取得に使用するメソッドのパラメータになります。私は、ちなみに

@RequestMapping(value = "enter", method = RequestMethod.POST) 
    public String doLogin(@ModelAttribute("user") @Valid LoginForm loginForm, BindingResult result, HttpSession session) { 
     // ... 
    } 

:正確なものに

ビット、私は新しいクラスを導入します:

public class LoginForm implements Serializable { 

    @NotNull 
    @Column(name="username", unique=true) 
    @Size(min=5) 
    private String username; 

    @NotNull 
    @Size(min=5) 
    private String password; 

    //Getters and Setters 

} 

を...そして、あなたの認証メソッドのシグネチャを変更しますパスワードを維持することはとても良い考えです。ハッシュを保存したり、認証が外部ディレクトリのドメインであると判断したりできます。

+0

私はそのアイデアを理解できるように具体的な例を教えてください。 「LoginformはValidatorを実装しています。 "public void Validate(ユーザーユーザー、エラーエラー){//検証ロジック}" –

+0

完了しました:-) –

+0

ええ、今私は理解できます。副次的な質問と同様に、フォームで読み込むことができます:検証からのエラーエラー?また、私はすべてのpasswods、したがって塩田をハッシュしています。 –

1

コードをきれいにしてシンプルにするために、登録とログインコントローラを作成する必要があります。コードが馬鹿に見えるようにしてください。維持しやすく、さらに実装するためにオープンします。

関連する問題