メモリ内のxmlユーザー名/パスワードを使用して認証すると機能するため、プロジェクトの次の段階はデータベースに対して認証することでした。これは私が永続的な問題を思いつくところです。何日も経ちました。
mysql dbに挿入したユーザー名であるデータベースb/cに少なくとも接続していることを示すコンソールの出力。
loadUserByUsername : ed23
ただし、認証する代わりに、ユーザー名/パスワードが正しい場合でも、ログイン失敗ページが返されます。
セキュリティ XML
<global-method-security pre-post-annotations="enabled" />
<http auto-config="true" use-expressions="true" access-denied-page="/denied">
<intercept-url pattern='/main/home.jsp' access="hasRole('ROLE_USER')" />
<intercept-url pattern='/admin/admin.jsp' access="hasRole('ROLE_ADMIN')" />
<form-login login-page='/login.jsp' always-use-default-target="true" default-
target-url="/main/home" authentication-failure-url="/login_error.jsp?error=true"/>
<logout invalidate-session="true" logout-success-url='/login.jsp' />
</http>
<!-- authentication manager and password hashing -->
<authentication-manager alias="authenticationManager">
<authentication-provider ref="daoAuthenticationProvider"/>
</authentication-manager>
<beans:bean id="daoAuthenticationProvider"
class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
<beans:property name="userDetailsService" ref="userDetailsService"/>
<beans:property name="saltSource">
<beans:bean
class="org.springframework.security.authentication.dao.ReflectionSaltSource">
<beans:property name="userPropertyToUse" value="username"/>
</beans:bean>
</beans:property>
<beans:property name="passwordEncoder" ref="passwordEncoder"/>
</beans:bean>
<beans:bean id="userDetailsService"
class="com.project.professional.service.StaffServiceImpl">
</beans:bean>
<beans:bean id="passwordEncoder"
class="org.springframework.security.authentication.encoding.ShaPasswordEncoder">
<beans:constructor-arg index="0" value="256"/>
</beans:bean>
ログインjsp
<form action="${loginUrl}" method="post" name="loginForm">
<p>
<label for="j_username">Username</label>
<input id="j_username" name="j_username" type="text" />
</p>
<p>
<label for="j_password">Password</label>
<input id="j_password" name="j_password" type="password" />
</p>
<input type="submit
value="Login"/>
</form>
コントローラ
@RequestMapping(value = "/main/home", method = RequestMethod.GET)
public String getHomePage(Locale locale, Model model) {
return "/main/home";
}
@RequestMapping(value="/", method = RequestMethod.GET)
public String getLoginPage(ModelMap model) {
logger.info("This is the login page {}.");
return "login";
}
ユーザー詳細の実装
public UserDetails loadUserByUsername(String username)
throws UsernameNotFoundException {
System.out.println("loadUserByUsername : " + username);
//DAO<Staff> sessionFactory = null;
Session session = sessionFactory.getCurrentSession();
username = (username == null) ? "" : username;
Query query = session
.createQuery("from Staff where username=:username");
query.setParameter("username", username);
if (query.list().isEmpty()) {
return null;
}
return (UserDetails) query.list().get(0);
}
public Staff getStaffDetails(String username) {
Session session = sessionFactory.getCurrentSession();
Query query = session.createQuery("from Staff where username=:username");
query.setParameter("username", username);
if (query.list().isEmpty()) {
return null;
}
return (Staff) query.list().get(0);
ナビゲーション バーからページにアクセスできますが、ログイン ページから認証された場合にのみアクセスできるように保護することはできません。助けていただければ幸いです。