Spring security中的系统的User只有username,password,enabled等几个属性,但是我们实际应用中对应的User肯定需要很多自定义的字段,比如说年龄,真实姓名,部门等字段,下面我们针对spring security的user进行自定义操作:
说明:为了简便,我们就只建立一个表,表中包括权限和用户信息,按正常情况应该要建立一个用户表,一个权限表以及一个中间表。
一,自定义User,继承
public class MyUser extends User {
private static final long serialVersionUID = -814031798199130344L;
/**
* 自定义扩展userbean
*/
private Object extendUserBean;
public Object getExtendUserBean() {
return extendUserBean;
}
public void setExtendUserBean(Object extendUserBean) {
this.extendUserBean = extendUserBean;
}
public MyUser(String username, String password,
boolean enabled,
boolean accountNonExpired, boolean credentialsNonExpired,
boolean accountNonLocked,
Collection<? extends GrantedAuthority> authorities) {
super(username, password, enabled, accountNonExpired, credentialsNonExpired,
accountNonLocked, authorities);
}
}
二,重写JdbcDaoImpl
public class UserDetailsDAO extends JdbcDaoImpl {
//需要注入自定义的userbean的全名
private String beanName;
/**
* 重写父类的loadUserByUsername方法
*/
public UserDetails loadUserByUsername(String username)
throws UsernameNotFoundException {
List<UserDetails> users = loadUsersByUsername(username);
if (users.size() == 0) {
logger.debug("Query returned no results for user '" + username
+ "'");
throw new UsernameNotFoundException(messages.getMessage(
"JdbcDaoImpl.notFound", new Object[] { username },
"Username {0} not found"));
}
// 这里强转为自己定义的user类
MyUser user = (MyUser) users.get(0); // contains no GrantedAuthority[]
Set<GrantedAuthority> dbAuthsSet = new HashSet<GrantedAuthority>();
if (getEnableAuthorities()) {
dbAuthsSet.addAll(loadUserAuthorities(user.getUsername()));
}
if (getEnableGroups()) {
dbAuthsSet.addAll(loadGroupAuthorities(user.getUsername()));
}
List<GrantedAuthority> dbAuths = new ArrayList<GrantedAuthority>(
dbAuthsSet);
addCustomAuthorities(user.getUsername(), dbAuths);
if (dbAuths.size() == 0) {
logger.debug("User '" + username
+ "' has no authorities and will be treated as 'not found'");
throw new UsernameNotFoundException(messages.getMessage(
"JdbcDaoImpl.noAuthority", new Object[] { username },
"User {0} has no GrantedAuthority"));
}
return createUserDetails(username, user, dbAuths);
}
/**
* 自定义查询处理的数据库字段和自定义的user类关联
*/
protected List<UserDetails> loadUsersByUsername(String username) {
return getJdbcTemplate().query(getUsersByUsernameQuery(),
new String[] { username }, new RowMapper<UserDetails>() {
public UserDetails mapRow(ResultSet rs, int rowNum)
throws SQLException {
String username = rs.getString("username");
String password = rs.getString("password");
boolean enabled = rs.getBoolean("enabled");
MyUser user = new MyUser(username, password, enabled,
true, true, true, AuthorityUtils.NO_AUTHORITIES);
user.setExtendUserBean(new BeanPropertyRowMapper(
getExtendUserClass()).mapRow(rs, rowNum));
return user;
}
});
}
protected UserDetails createUserDetails(String username, MyUser user,
List<GrantedAuthority> combinedAuthorities) {
String returnUsername = user.getUsername();
MyUser newUser = new MyUser(returnUsername, user.getPassword(),
user.isEnabled(), true, true, true, combinedAuthorities);
newUser.setExtendUserBean(user.getExtendUserBean());
return newUser;
}
//得到对应的类名
private Class getExtendUserClass() {
try {
return Class.forName(beanName).newInstance().getClass();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return Object.class;
}
public String getBeanName() {
return beanName;
}
public void setBeanName(String beanName) {
this.beanName = beanName;
}
}
三,spring-security.xml 配置文件的修改
<!-- 指定一个自定义的authentication-manager :customUserDetailsService -->
<security:authentication-manager alias="theAuthenticationManager">
<security:authentication-provider user-service-ref="userDetailsDAO">
<security:password-encoder ref="passwordEncoder">
<security:salt-source system-wide="testsalt"/>
</security:password-encoder>
</security:authentication-provider>
</security:authentication-manager>
<!-- 自定义查询出来的user-->
<bean id="userDetailsDAO" class="com.spring.security.entend.UserDetailsDAO">
<property name="dataSource" ref="dataSource"></property>
<property name="beanName" value="com.spring.security.entend.ExtendUser"></property>
<property name="usersByUsernameQuery" value="select username,password,enabled,age,realName from user where username = ?"/>
<property name="authoritiesByUsernameQuery" value="select username,authority from user where username = ?"/>
<property name="rolePrefix" value="ROLE_"></property>
</bean>
<!-- 对密码进行MD5编码 -->
<bean id="passwordEncoder" class="org.springframework.security.authentication.encoding.Md5PasswordEncoder">
</bean>
扩展的userBean
public class ExtendUser {
//自定义扩展字段
private int age;
private String realName;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getRealName() {
return realName;
}
public void setRealName(String realName) {
this.realName = realName;
}
}

本文介绍了如何在Spring Security中扩展User类,添加自定义字段如年龄和真实姓名,并展示了如何重写JdbcDaoImpl以处理自定义的User类,同时提供了相应的XML配置示例。

210

被折叠的 条评论
为什么被折叠?



