第1章 概述

一些场景下,UniEAP Report 虽然直接面向最终用户,但是作为一个相对独立的附加功能使用,例如从一个门户系统跳转访问,此时UniEAP Report虽然也需要区分的用户,但用户都是通过外部门户访问,并不直接访问Report应用。两者的会话关联并没有很强的联系,Report 需要借助业务系统的入口访问,此时可以采用一种相对简单的方法进行集成:在业务系统中完成登录后立即向Report后台接口发送认证请求,在Report中认证成功后自动完成登录。

1.1 发起登录请求

登录请求可以使用表单POST到 Report 服务 /login 接口( 比如,http://10.4.45.105:8181/report/login),默认用户名参数为a,密码参数为p。传递后的身份认证处理使用基于 DaoAuthenticationProvider 的认证。

1.2 基于 DaoAuthenticationProvider 的认证

该接口是Report用户名密码表单登录时使用的实现。它会调用注入的 org.springframework.security.core.userdetails.UserDetailsService 对象获取用户身份相关信息 org.springframework.security.core.userdetails.UserDetails, 然后使用UserDetails信息与用户输入的密码或Token进行比较验证。

1.2.1 UserDetailsService

  public interface UserDetailsService {
    /**
     * @param username 登录名
     */
      UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
  }

在进行身份验证集成时,集成者可以添加自己的UserDetailsService实现, 方法返回 UserDetails 对象(必须包含credential),并设置相应的角色,然后修改 applicationContext-security.xml中的 userDetailService bean的配置,实现登录用户信息的获取。但 如果需要Report和已有系统做用户集成,则应该实现用户集成接口的方式实现身份获取 ,这是Report更推荐的方式。

1.2.2 认证校验

取到身份信息后,需要做密码/Token比较验证,这里会使用到org.springframework.security.crypto.password.PasswordEncoder接口。

public interface PasswordEncoder {

    /**
     * 加密方法,对传入的字符串进行加密,返回加密后的字符串
     * @param 加密前的字符串
     */
    String encode(CharSequence rawPassword);

    /**
     * 密码验证方法,比较加密前和加密后的字符串是否匹配
     * 对rawPassword进行加密,在与encodedPassword比较
     * @param 加密前的字符串
     * @param 加密后的字符串
     * @return 
     */
    boolean matches(CharSequence rawPassword, String encodedPassword);

}

Report自带的用户名/密码方式的验证使用的是 org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder 实现,如果集成时使用的密码是明文存储,可以配置为org.springframework.security.crypto.password.NoOpPasswordEncoder,如果使用特定的规则,则可以添加自己的实现。

该配置在 applicationContext-security.xml 的 bcryptEncoder bean。

results matching ""

    No results matching ""

    results matching ""

      No results matching ""