【发布时间】:2014-12-20 07:47:46
【问题描述】:
我正在开发一个使用 Spring-Security 的 Spring-MVC 应用程序。我需要获取当前经过身份验证的用户对象,以便可以使用 setUser() 方法。但是该方法返回 null,程序似乎因空指针异常而崩溃。请看一下代码。我已经调试了+try-catch,它没有返回用户。
调用 getCurrentlyAuthenticatedUser() 会引发异常。当我检查时,它说身份验证为空。
我已经通过实现接口 UserDetails 和 UserDetailsService 来实现 Spring-Security。
人物类:
@Entity
@Table(name="person")
public class Person implements UserDetails{
private static final GrantedAuthority USER_AUTH = new SimpleGrantedAuthority("ROLE_USER");
@Id
@Column(name="id")
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "person_seq_gen")
@SequenceGenerator(name = "person_seq_gen",sequenceName = "person_seq")
private int id;
@Column(name = "username")
private String username;
@Column(name = "password")
private String password;
@Transient
private final String PERMISSION_PREFIX = "ROLE_USER";
@Transient
private List<GrantedAuthority> authorities;
@Transient
private String role;
@OneToMany(cascade = CascadeType.ALL,mappedBy = "person1")
private Set<Notes> notes1;
public Set<Notes> getNotes1() {
return notes1;
}
public void setNotes1(Set<Notes> notes1) {
this.notes1 = notes1;
}
}
登录服务实现:
@Transactional
@Service("userDetailsService")
public class LoginServiceImpl implements UserDetailsService{
@Autowired private PersonDAO personDAO;
@Autowired private Assembler assembler;
private static final GrantedAuthority USER_AUTH = new SimpleGrantedAuthority("ROLE_USER");
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException,DataAccessException {
Person person = personDAO.findPersonByUsername(username);
return assembler.buildUserFromUserEntity(person);
}
}
汇编类:
@Service("汇编器")
public class Assembler {
@Transactional(readOnly = true)
User buildUserFromUserEntity(Person userEntity){
String username = userEntity.getUsername();
String password = userEntity.getPassword();
// Long id = userEntity.getId();
boolean enabled = userEntity.isActive();
boolean accountNonExpired = userEntity.isAccountNonExpired();
boolean credentialsNonExpired = userEntity.isCredentialsNonExpired();
boolean accountNonLocked = userEntity.isAccountNonLocked();
Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
authorities.add(new SimpleGrantedAuthority("ROLE_USER"));
User user = new User(username,password,enabled,accountNonExpired,credentialsNonExpired,accountNonLocked,authorities);
return user;
}
}
// 我在 getPrincipal 的以下方法中遇到错误 PersonServiceImpl :
@Service
public class PersonServiceImpl implements PersonService {
private PersonDAO personDAO;
@Override
public Person getCurrentlyAuthenticatedUser() throws Exception{
Authentication a = SecurityContextHolder.getContext().getAuthentication();
Person currentUser = (Person) a.getPrincipal();
if(currentUser == null){
throw new Exception("No authenticated user retrieved");
}else {
System.out.println("We have currently authenticated user");
return currentUser;
}
}
Spring Security-xml
<import resource="servlet-context.xml" />
<!-- Global Security settings -->
<security:global-method-security pre-post-annotations="enabled" />
<security:http pattern="/" security="none" />
<security:http create-session="ifRequired" use-expressions="true" auto-config="false" disable-url-rewriting="true">
<security:port-mappings>
<security:port-mapping http="80" https="443"/>
</security:port-mappings>
<security:session-management session-fixation-protection="migrateSession" invalid-session-url="/invalidSession.html">
<security:concurrency-control max-sessions="3" error-if-maximum-exceeded="true" expired-url="/sessionExpired.html"/>
</security:session-management>
<security:form-login login-page="/login" default-target-url="/note/add" always-use-default-target="true" authentication-failure-url="/login?error"/>
<security:authentication-manager alias="authenticationManager">
<security:authentication-provider user-service-ref="LoginServiceImpl" />
</security:authentication-manager>
<beans:bean id="daoAuthenticationProvider"
class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
<beans:property name="userDetailsService" ref="LoginServiceImpl"/>
</beans:bean>
</beans>
【问题讨论】:
-
请给出相关信息:崩溃:异常+stacktrace,方法返回null什么方法,它不返回用户:什么调用不返回信息...
-
@Orici 提出这个问题表明你没有做功课,也没有做任何研究工作。我谦虚而友善的建议是,请从基础开始,先了解它的工作原理,否则你会伤害自己并开始说 spring 和 java 很烂,只有 rails 或 node 可以拯救你。
-
@SergeBallesta :我已经编辑了我的帖子以包含崩溃的函数 getCurrentlyAuthenticatedUser()。我有自己的 try-catch 块,异常读取 Authentication is null。
-
@Orici 很明显,您的身份验证无法正常工作,您必须确保在调用 SecurityContextHolder.getContext().getAuthentication() 时获得身份验证实例
标签: spring-mvc spring-security