spring security 扩展User,自定义User字段

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

Spring security中的系统的User只有username,password,enabled等几个属性,但是我们实际应用中对应的User肯定需要很多自定义的字段,比如说年龄,真实姓名,部门等字段,下面我们针对spring securityuser进行自定义操作:

 

说明:为了简便,我们就只建立一个表,表中包括权限和用户信息,按正常情况应该要建立一个用户表,一个权限表以及一个中间表。

 

 

一,自定义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 accountNonExpiredboolean credentialsNonExpired,

boolean accountNonLocked,

Collection<? extends GrantedAuthority> authorities) {

super(usernamepasswordenabledaccountNonExpiredcredentialsNonExpired,

accountNonLockedauthorities);

}

}

 

二,重写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(usernameuserdbAuths);

}

 

/**

 * 自定义查询处理的数据库字段和自定义的user类关联

 */

protected List<UserDetails> loadUsersByUsername(String username) {

return getJdbcTemplate().query(getUsersByUsernameQuery(),

new String[] { username }, new RowMapper<UserDetails>() {

public UserDetails mapRow(ResultSet rsint rowNum)

throws SQLException {

String username = rs.getString("username");

String password = rs.getString("password");

boolean enabled = rs.getBoolean("enabled");

MyUser user = new MyUser(usernamepasswordenabled,

truetruetrue, AuthorityUtils.NO_AUTHORITIES);

user.setExtendUserBean(new BeanPropertyRowMapper(

getExtendUserClass()).mapRow(rsrowNum));

return user;

}

 

});

}

 

protected UserDetails createUserDetails(String username, MyUser user,

List<GrantedAuthority> combinedAuthorities) {

String returnUsername = user.getUsername();

MyUser newUser = new MyUser(returnUsernameuser.getPassword(),

user.isEnabled(), truetruetruecombinedAuthorities);

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;

}

}

您可能感兴趣的与本文相关的镜像

Yolo-v8.3

Yolo-v8.3

Yolo

YOLO(You Only Look Once)是一种流行的物体检测和图像分割模型,由华盛顿大学的Joseph Redmon 和Ali Farhadi 开发。 YOLO 于2015 年推出,因其高速和高精度而广受欢迎

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值