有2套系统想整合,老系统使用spring2.0的Security安全机制,新系统要调用老系统的信息,因为没有登录信息不能取到,现在想从数据库取出User能放入Security里?网上搜了很多都是取出的,如何能放入?谢谢

解决方案 »

  1.   

    SecurityContextHolder如何放入User而达到鉴权通过?现在SecurityContextHolder是空的
      

  2.   

    如何构建Authentication传入SecurityContextHolder
      

  3.   

    你的意思是老系统有登陆信息,新系统直接从数据库取出登陆信息,放入user,再放入Authentication,在放入SecurityContextHolder, 我是这样理解。
    如果是这样,扩展Spring Security,最直接就是开发自定义的AuthenticationProvider,替换默认的。
      

  4.   

    如果这样,实现UserDetailsService就可以,我用的是3.0,我以为你是用老系统登陆,相当于sso,老系统登陆,返回token,在新系统用。
      

  5.   

    就是在过滤器里,调用实现这个类的方法然后再把UserDetailsService的对象传入SecurityContextHolder么?谢谢
      

  6.   

    我用
    SecurityContext ctx = SecurityContextHolder.getContext();               
    Authentication auth = ctx.getAuthentication();
    auth.setUserDetails(user);
    ctx取出来是NULL
      

  7.   

    楼主可能对springsecurity结构不了解,UserDetailsService实现负责获取User,即UserDetail的实现,只要在Provider配置UserDetailsService实现就可以,通过Filters,进入action,在action里
    SecurityContext ctx = SecurityContextHolder.getContext();  
    Authentication auth = ctx.getAuthentication();auth已经包含User
      

  8.   

      <bean id="authManager" class="org.acegisecurity.providers.ProviderManager">
            <property name="providers">
                <list>
                    <bean id="daoAuthProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider">
                      <property name="userDetailsService" ref="userDao"/>
                    </bean>
                </list>
            </property>
        </bean>
    现在配置文件里已经有这个的实现,如果老系统登录过以后,新系统连接就没有任何问题,现在希望绕过登录,直接从数据库获取UserDetails对象方法也有,我直接把UserDetails对象放入Authentication,但是在点击连接的时候,过滤器又拦截权限了跳转到登陆页面了,都3天了研究的郁闷死了,难道跟验证码有关?
      

  9.   

    现在我在老系统写了个过滤器,所有的action都走这个过滤器,用User user = (User)SecurityContextHolder.getContext().getAuthentication().getUserDetails();进行判断,如果为空则构造Authentication,用loadUserByUsername取出数据后构造Authentication,放入SecurityContextHolder但是里面有几个属性没有填充