Spring MVC webapp を保護するために Shiro を使用しています。永続化のために Hibernate を使用しているため、AuthenticationInfo オブジェクトを取得して設定する HibernateRealm があります。
@Override
@Transactional
protected AuthenticationInfo doGetAuthenticationInfo(
AuthenticationToken token) throws AuthenticationException {
Account account = accountDao.findByUsername((String)token.getPrincipal());
SimplePrincipalCollection principals = new SimplePrincipalCollection(account, getName());
SimpleAccount info = new SimpleAccount(principals, account.getPassword());
return info;
}
Account
私のカスタムユーザークラスです。DAO を使用してAccount
、ユーザー名で取得します。この方法を作ることに何か意味があるのだろうかと思っていました@Transactional
。結局、これは読み取り専用操作です。
次の問題もあります。DAOはsessionFactory.getCurrentSession()
セッションを取得しますが、取得しています
HibernateException: No Session found for current thread
メソッドが呼び出されたとき。私はアプリケーションコンテキストにこれらを持っています:
<tx:annotation-driven transaction-manager = "transactionManager" />
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
Spring がセッションを開いてくれない理由がわかりません。
編集:@Controller
ログインするには、 Shiro のSpring メソッドを使用してこれを行います。Subject
@RequestMapping(value = "/account/login", method = RequestMethod.POST)
public String login(@RequestParam("username") String username, @RequestParam("password") String password) {
Subject currentUser = SecurityUtils.getSubject();
if (!currentUser.isAuthenticated) {
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
currentUser.login(token);
return "profile";
}
return "home";
}
内部的には、Shiro は上記のレルム メソッドを使用して、保存されているユーザー名/パスワード情報を取得します。@Autowired
DAO を使用して、正しいアカウントのデータベースをチェックします。次に、パスワードをCredentialsMatcher
実装と照合します。