0 0

关于spring security3中密码获取的问题10

    我在配置spring security3中,有一个非常困惑的问题。
    在登录页面,基于 /j_spring_security_check 的登录后,继承UserDetailsService接口,并且实现函数loadByUserName(String username)。
    我要问的是,我如何取得密码?传递进来的只是一个帐户,没有密码。
    还是我对登录这块理解错误?望指教。

问题补充:
yangzhanchun 写道
load到了User对象后,框架会帮你匹配密码是否正确

你是不是指我在UserDetailsService中,如将数据库根据用户名找出的密码放入新创建的UserDetails中,security自动会根据之前登录页面提交的密码和我之后数据库中匹配出的密码进行比较,并返回正确或错误页面。是吗?

问题补充:
yangzhanchun 写道
load到了User对象后,框架会帮你匹配密码是否正确

刚验证了,确实如你所说,看来我教程没看明白。多谢。
2012年5月16日 15:14

3个答案 按时间排序 按投票排序

0 0

采纳的答案

load到了User对象后,框架会帮你匹配密码是否正确

2012年5月17日 08:26
0 0

Spring Security3中loadByUserName(String username)只是根据用户名获取User实体。具体认证的过程中再验证该账号是否能够认证通过。至于密码判断部分的源码为
org.springframework.security.authentication.dao.DaoAuthenticationProvider类的additionalAuthenticationChecks方法
如果想更深入了解这个安全框架,可参考本人的专栏
http://dead-knight.iteye.com/admin/categories/220917

2012年5月28日 21:19
0 0

去重新他的CustomUserDetails
示例代码:

public class User extends IdEntity implements CustomUserDetails {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private String userAccount;
	private String userPassword;// 为简化演示使用明文保存的密码
	private String userName;
	private String issys;
	private String userDesc;
	private String userDuty;
	private Integer deptId;
	private String subSystem;
	private String isenabled;
	private List<Role> roleList = Lists.newArrayList();// 有序的关联对象集合

	// 实现了UserDetails之后的相关变量
	private Long userId;
	private String password;
	private String username;
	private Set<GrantedAuthority> authorities;
	private boolean accountNonExpired;
	private boolean accountNonLocked;
	private boolean credentialsNonExpired;
	private Set<Menus> menus = Sets.newTreeSet();

	public User() {
	}

	public User(Long userId, String userAccount, String userName, String userPassword,
			String desc, String duty, Integer dept, boolean enable,
			boolean accountNonExpired, boolean credentialsNonExpired,
			boolean accountNonLocked, Set<GrantedAuthority> authorities, Set<Menus> menus) {
		this.userDuty = duty;
		this.userDesc = desc;
		this.deptId = dept;
		this.userName = userName;
		this.username = userAccount;
		this.password = userPassword;
		this.accountNonExpired = accountNonExpired;
		this.credentialsNonExpired = credentialsNonExpired;
		this.accountNonLocked = accountNonLocked;
		this.authorities = authorities;
		this.menus = menus;
		this.userId = userId;
	}

	// 字段非空且唯一, 用于提醒Entity使用者及生成DDL.
	@Column(nullable = false, unique = true)
	public String getUserAccount() {
		return userAccount;
	}

	public void setUserAccount(String userAccount) {
		this.userAccount = userAccount;
	}

	// 多对多定义
	@ManyToMany
	// 中间表定义,表名采用默认命名规则
	@JoinTable(name = "SYS_USERS_ROLES", joinColumns = { @JoinColumn(name = "USER_ID") }, inverseJoinColumns = { @JoinColumn(name = "ROLE_ID") })
	// Fecth策略定义
	@Fetch(FetchMode.SUBSELECT)
	// 集合按id排序.
	@OrderBy("id")
	// 集合中对象id的缓存.
	@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
	public List<Role> getRoleList() {
		return roleList;
	}

	public void setRoleList(List<Role> roleList) {
		this.roleList = roleList;
	}

	/**
	 * 用户拥有的角色名称字符串, 多个角色名称用','分隔.
	 */
	// 非持久化属性.
	@Transient
	public String getRoleNames() {
		return Converts.convertElementPropertyToString(roleList, "roleDesc",
				", ");
	}

	/**
	 * 用户拥有的角色id字符串, 多个角色id用','分隔.
	 */
	// 非持久化属性.
	@Transient
	@SuppressWarnings("unchecked")
	public List<Long> getRoleIds() {
		return Converts.convertElementPropertyToList(roleList, "id");
	}

	@Override
	public String toString() {
		return ToStringBuilder.reflectionToString(this);
	}

	public String getUserPassword() {
		return userPassword;
	}

	public void setUserPassword(String userPassword) {
		this.userPassword = userPassword;
	}


	public String getIssys() {
		return issys;
	}

	public String getSubSystem() {
		return subSystem;
	}


	public String getUserDesc() {
		return userDesc;
	}

	public String getUserDuty() {
		return userDuty;
	}

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public void setUserDesc(String userDesc) {
		this.userDesc = userDesc;
	}

	public void setIssys(String issys) {
		this.issys = issys;
	}

	public void setUserDuty(String userDuty) {
		this.userDuty = userDuty;
	}


	public void setSubSystem(String subSystem) {
		this.subSystem = subSystem;
	}

	@Transient
	@Override
	public Collection<GrantedAuthority> getAuthorities() {
		return authorities;
	}

	@Transient
	@Override
	public String getPassword() {
		return password;
	}

	@Transient
	@Override
	public String getUsername() {
		return username;
	}

	@Transient
	@Override
	public boolean isAccountNonExpired() {
		return accountNonExpired;
	}

	@Transient
	@Override
	public boolean isAccountNonLocked() {
		return accountNonLocked;
	}

	@Transient
	@Override
	public boolean isCredentialsNonExpired() {
		return credentialsNonExpired;
	}

	@Transient
	@Override
	public boolean isEnabled() {
		return true;
	}

	public Integer getDeptId() {
		return deptId;
	}

	public void setDeptId(Integer deptId) {
		this.deptId = deptId;
	}

	public String getIsenabled() {
		return isenabled;
	}

	public void setIsenabled(String isenabled) {
		this.isenabled = isenabled;
	}

	@Transient
	public Set<Menus> getMenus() {
		return menus;
	}

	@Transient
	public Long getUserId() {
		return userId;
	}

}

/**
 *实现了UserDetails,扩展几项信息,比如getSubSystem()方法等 sparta 11/4/13。
 */
public interface CustomUserDetails extends UserDetails {

	public Long getUserId();
	
	//用户名
	public String getUserName();

	//用户描述或简介
	public String getUserDesc();

	//所属的单位
	public Integer getDeptId();

	//用户职位
	public String getUserDuty();
	
	public Set<Menus> getMenus();
	
}
public class UserDetailsServiceImpl implements UserDetailsService {

	private AccountManager accountManager;

	/**
	 * 获取用户Details信息的回调函数.
	 */
	public UserDetails loadUserByUsername(String username)
			throws UsernameNotFoundException, DataAccessException {

		User user = accountManager.findUserByLoginName(username);
		if (user == null) {
			throw new UsernameNotFoundException("用户" + username + " 不存在");
		}

		Set<GrantedAuthority> grantedAuths = obtainGrantedAuthorities(user);
		Set<Menus> menu = getAllMenus(user);
		boolean enabled = true;
		boolean accountNonExpired = true;
		boolean credentialsNonExpired = true;
		boolean accountNonLocked = true;

		/*
		 * UserDetails userdetails = new
		 * org.springframework.security.core.userdetails.User(
		 * user.getUserAccount(), user.getUserPassword(), enabled,
		 * accountNonExpired, credentialsNonExpired, accountNonLocked,
		 * grantedAuths);
		 */
		
		User userdetails = new User(user.getId(), user.getUserAccount(), user.getUserName(),
				user.getUserPassword(), user.getUserDesc(), user.getUserDuty(),
				user.getDeptId(), enabled, accountNonExpired,
				credentialsNonExpired, accountNonLocked, grantedAuths, menu);

		return userdetails;
	}

	/**
	 * 获得用户所有角色的权限集合.
	 */
	private Set<GrantedAuthority> obtainGrantedAuthorities(User user) {
		Set<GrantedAuthority> authSet = Sets.newHashSet();
		for (Role role : user.getRoleList()) {
			for (Authority authority : role.getAuthorityList()) {
				authSet.add(new GrantedAuthorityImpl(authority
						.getPrefixedName()));
			}
		}
		return authSet;
	}
	
	private Set<Menus> getAllMenus(User user) {
		Set<Menus> menus = Sets.newTreeSet();
		for (Role role : user.getRoleList()) {
			for (Menus menu : role.getMenusList()) {
				menus.add(menu);
			}
		}
		return menus;
	}

	@Autowired
	public void setAccountManager(AccountManager accountManager) {
		this.accountManager = accountManager;
	}
}

2012年5月16日 17:30

相关推荐

    SpringBoot+SpringSecurity处理Ajax登录请求问题(推荐)

    SpringBoot+SpringSecurity处理Ajax登录请求问题是SpringBoot开发中的一個常见问题,本文将详细介绍如何使用SpringBoot+SpringSecurity处理Ajax登录请求问题。 知识点1:SpringBoot+SpringSecurity框架简介 ...

    springsecurity学习笔记

    在"springsecurity学习笔记"中,你可能会涉及以下主题: - Spring Security的基本配置,包括web安全配置和全局安全配置。 - 如何自定义认证和授权流程,比如实现自定义的AuthenticationProvider和...

    Spring Security 3.pdf

    1. **XML配置**: 在Spring Security 3中,主要使用XML配置来定义安全设置。这包括定义过滤器链、认证提供者、访问决策策略等。例如,`&lt;http&gt;`元素用于配置URL保护,`&lt;authentication-manager&gt;`用于定义认证策略。 2...

    spring-security 官方文档 中文版

    本文档所指的版本为 Spring Security 3.0.1,这是一个 bug fix 版本,主要针对 3.0 版本中存在的问题进行修复,确保开发者能够获取更稳定可靠的 Spring Security 库。 **1.4 获取 Spring Security** - **项目模块*...

    springSecurity3例子

    下面将详细探讨Spring Security 3中的关键知识点。 1. **核心组件**: - **Filter Chain**: Spring Security的核心在于其过滤器链,它处理HTTP请求,执行认证和授权过程。这些过滤器包括`DelegatingFilterProxy`、...

    Spring Security 3全文下载

    在Spring Security 3版本中,该框架进行了大量的改进和优化,提供了更全面的安全控制,包括认证、授权、会话管理以及CSRF防护等。本文将深入探讨Spring Security 3的关键概念、核心组件以及实际应用。 1. **核心...

    SpringSecurity学习总结源代码

    3. **UserDetailsService**:接口用于获取用户信息,通常与数据库中的用户表关联,提供用户名和密码的验证服务。 4. **Access Decision Manager**:管理权限决策,当用户试图访问资源时,该组件会决定是否允许访问...

    spring security 3 多页面登录 小秘密小运气

    在"Spring Security 3 多页面登录 小秘密小运气"这个主题中,我们可以深入探讨Spring Security 3如何支持多个登录页面以及其中可能涉及的一些技巧和策略。 首先,Spring Security的核心功能包括身份验证、授权、...

    springSecurity 实现传参

    在这个场景中,我们关注的是如何使用Spring Security实现登录验证以及在登录过程中传递参数,特别是记录并返回用户登录前的页面。我们将深入探讨这个过程,并结合MySQL数据库的使用。 首先,让我们了解Spring ...

    Spring Security 3多用户登录实现一

    在本文中,我们将深入探讨如何在Spring Security 3中实现多用户登录功能。首先,我们需要理解Spring Security的基本架构和核心概念。 1. **Spring Security 架构** Spring Security的核心组件包括: - **Filter ...

    SpringSecurity笔记,编程不良人笔记

    3. **SpringBoot整合SpringSecurity** - `spring-boot-starter-security`依赖:SpringBoot项目中添加此依赖即可自动配置SpringSecurity。 - 自定义登录页面:通过设置`loginPage`和`loginProcessingUrl`属性,可以...

    Spring_Security3中文指南.pdf

    这不仅有助于加深对 Spring Security 的理解,还能在实践中遇到并解决实际问题。 #### 七、项目资源与支持 Spring Security 的官方网站提供了详细的文档、教程和示例代码。此外,还有活跃的社区论坛和邮件列表,...

    Spring security oauth源码

    同时,了解这些源码也有助于调试和解决Spring Security OAuth在实际项目中遇到的问题。 总之,Spring Security OAuth源码提供了一个深入了解OAuth 2.0协议及其在Spring生态系统中实现的绝佳机会。通过研究Sparklr2...

    Spring Security3

    ### Spring Security3 相关知识点概述 #### 第一章:一个不安全应用的剖析 **安全审计** - **目的**:识别系统中的安全隐患,并评估安全措施的有效性。 - **过程**:通过模拟攻击来测试系统的安全性,分析日志记录...

    Spring Security 2 中文参考文档(chm)

    在Spring Security 2版本中,它提供了丰富的功能,包括身份验证、授权、访问控制以及安全相关的会话管理。这份中文参考文档是学习和理解Spring Security 2的重要资源。 **一、身份验证** 在Spring Security中,身份...

    spring security3笔记

    以上是Spring Security 3的核心知识点,但实际应用中,开发者还需要结合具体的业务需求进行细致的配置和定制。对于初学者来说,理解这些基本概念和组件的工作原理至关重要,而熟悉Spring Security的源码则能帮助深入...

    spring boot3.x结合spring security最新版实现jwt登录验证

    本教程将详细讲解如何在Spring Boot 3.x版本中结合Spring Security的最新版实现JWT(JSON Web Token)登录验证。 首先,让我们了解JWT。JWT是一种轻量级的身份认证和授权机制,它以JSON对象的形式在客户端和服务器...

    Spring Security 5.1 中文 参考手册 中文文档

    - Spring Security 提供了多种身份验证机制,如基于用户名/密码的登录,支持Remember Me功能,以及OAuth2和OpenID Connect集成。5.1版本可能包含了对最新认证协议的支持,确保了与当前认证标准的兼容性。 2. **...

Global site tag (gtag.js) - Google Analytics