Hi.
I did custom userdetailservice. I hope this will help you.
My security.xml:
Code:
<global-method-security secured-annotations="enabled">
</global-method-security>
<http auto-config="false" access-denied-page="/accessDenined.jsp">
<intercept-url pattern="/web/**" access="ROLE_ADMIN,ROLE_USER"/>
<intercept-url pattern="/web/admin/logFailure" filters="none" />
<form-login login-page="/login.jsp" authentication-failure-url="/web/admin/logFailure"
default-target-url="/web/admin/logSucess"
always-use-default-target="true" />
<logout logout-success-url="/login.jsp?logout=true" />
</http>
<authentication-provider user-service-ref="customUserDetailService" />
Custom User Detail Service Been in application-config.xml:
Code:
<bean id="customUserDetailService" class="com.programmarstamil.www.controller.MyUserDetailsService">
<property name="dataSource" ref="dataSource" />
</bean>
Custom User Service Implemented Class:
Code:
public class MyUserDetailsService implements UserDetailsService{
private DataSource dataSource;
@Override
public UserDetails loadUserByUsername(String username)
throws UsernameNotFoundException, DataAccessException {
// TODO Auto-generated method stub
String sql = "select * from users where username like :username";
MapSqlParameterSource source = new MapSqlParameterSource();
source.addValue("username", username);
SimpleJdbcTemplate sjt = new SimpleJdbcTemplate(getDataSource());
User user = sjt.queryForObject(sql, new UserMapper(), source);
return user;
}
public DataSource getDataSource() {
return dataSource;
}
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
public GrantedAuthority[] getAuthorities(boolean isAdmin){
List<GrantedAuthority> authList = new ArrayList<GrantedAuthority>(2);
authList.add(new GrantedAuthorityImpl("ROLE_USER"));
if(isAdmin){
authList.add(new GrantedAuthorityImpl("ROLE_ADMIN"));
}
return authList.toArray(new GrantedAuthority[]{});
}
public class UserMapper implements ParameterizedRowMapper<User>{
@Override
public User mapRow(ResultSet rs, int arg1) throws SQLException {
// TODO Auto-generated method stub
return new User(rs.getString("username"),rs.getString("password"),true,true,true,true,getAuthorities(rs.getBoolean("admin")));
}
}
}
Also Handler:
Code:
@Controller
public class AdminController {
public AdminController(){
}
@RequestMapping(method=RequestMethod.GET)
public void logFailure(Model model){
model.addAttribute("failureMessage","Please Provide Correct Information");
}
@RequestMapping(method=RequestMethod.GET)
public String logSucess(Principal user){
return "redirect:secured";
}
}
In view
Code:
<c:if test='${not empty failureMessage}'>
<div class="error">
<div class="message error" >
<strong>Login failed:</strong> | <span>${failureMessage}</span>
</div>
</div>
</c:if>