我有一个成功运行的Spring 4 MVC项目,后端有很多RESTful Web服务。我们也使用Hibernate 5和Spring Security 4。
1)我们从第三方来源OpenAM 10.x对用户进行身份验证,这会在浏览器中创建一个令牌。
2)从前端,我们传入一个包含该OpenAM令牌的请求头的Ajax调用
3)在后端,使用SiteMinder示例,有一个服务:CustomUserDetailsService,它执行以下操作:
a)这使用我们的代码来openAM并传入令牌
b)我们获取我们解析的JSON数据以获取用户名
c)从那里我们使用Hibernate Spring Security代码获取该用户的更多细节并获得角色
System.out.println("loadUserByUsername: username : " + username);
UserAccountEntity userAccountEntity = userAccountDao.getByUsername(username);
System.out.println("loadUserByUsername: userAccountEntity : " + userAccountEntity);
if (userAccountEntity == null)
{
System.out.println("CustomUserDetailsService: userAccountEntity not found");
throw new UsernameNotFoundException("Username not found");
}
System.out.println("CustomUserDetailsService: START: springframework.user");
// this "User" object is: org.springframework.security.core.userdetails.User
User user = new User(userAccountEntity.getUsername(), userAccountEntity.getPassword(), true, true, true, true,
getGrantedAuthorities(userAccountEntity));
从这里开始,我们在URL端点上运行安全性......这非常有效!
现在,问题是......我的老板想要使用我们的自定义专有ACL系统来进行安全的查询调用。拨打电话获取记录,我们希望确保只获取用户有权访问的记录。我们有自己的ACL表,允许用户或角色对某些对象的安全性。可以这么说,这是在Spring Security ACL出现之前编写的。我更喜欢使用Spring Security 4 ACL,但这是不可能的。
考虑我们有4个级别,实体,Dao,服务,Web服务。单个控制器如下所示:
@RequestMapping(value = "", method = RequestMethod.GET, headers = "Accept=application/json")
public @ResponseBody ArrayList<SponsorEntity> getSponsorList1() {
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
User user = null;
if (principal instanceof User)
{
user = ((User) principal);
}
ArrayList<SponsorEntity> sponsorEntityList = (ArrayList) service.getAllList();
return sponsorEntityList;
}
就像我说的,这通过CustomUserDetailsService并按照上面的定义设置User。那么,第一个问题是,在DAO层中,我将使用什么代码来提取这个org.springframework.security.core.userdetails.User?
如果我可以从DAO层获取此User对象,那么我可以将该用户名“管道”到我们现有的旧代码中。
第二个问题......在DAO单元测试中,如何创建/设置此安全性?通过这种方式,我可以测试我的后端代码是否真正从经过身份验证的用户获取用户名。
如果您需要更多信息,请与我们联系。谢谢!