问题描述
在自定义UserDetailsService时我继承了JdbcDaoImpl,并重写了loadUserByUsername()方法在方法体中:@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException {UserDetails ud = super.loadUserByUsername(username);AuthUserDetails authUser = new AuthUserDetails(ud.getUsername(),ud.getPassword(),ud.isEnabled(),ud.isAccountNonExpired(),ud.isCredentialsNonExpired(),ud.isAccountNonLocked(),ud.getAuthorities());}调用了父类的loadUserByUsername()方法,是不是就是走了父类中的sql: public static final String DEF_USERS_BY_USERNAME_QUERY = "SELECT username,password,enabled " + "FROM users " + "WHERE username = ?";这样我是不是就得建users表?我感觉这个我能通过自己自定义应该可以重写一下吧?求ss大牛...
解决方案
还要修改一个地方,就是JdbcUserDetailsManager中执行这个sql的部分。建议增加一个类,继承JdbcUserDetailsManager,覆盖loadUsersByUsername方法。
解决方案二:
[url][/url]
解决方案三:
UserDetails ud = super.loadUserByUsername(username); 你在自定义方法执行时先执行了父类的方法,肯定是调用了父类的实现了, 想实现自定义sql可以在配置文件中自定义
解决方案四:
看下面配置你就应该明白了。<bean id="userDetailsService" class="org.acegisecurity.userdetails.jdbc.JdbcDaoImpl"> <property name="dataSource" ref="dataSource" /> <property name="usersByUsernameQuery"> <value> SELECT username,password,1 FROM t_user WHERE status='1' AND username = ? </value> <!-- 根据用户名查询用户的SQL语句 --> </property> <property name="authoritiesByUsernameQuery"> <value> SELECT u.username,p.priv_name FROM t_user u,t_user_priv p WHERE u.user_id =p.user_id AND u.username = ? </value> <!-- 根据用户名查询用户权限的sql语句 --> </property> </bean>