Spring Security(3)

Spring Security(3)

您好,我是湘王,这是我的云海天,欢迎您来,欢迎您再来~

 

前面运行写好的代码之所以没有任何显示,是因为还没有对Spring Security进行配置,当然啥也不显示了。这就好比你坐在车上,却不打开发动机,车子当然跑不起来。所以咱们就来让它跑起来。不过在配置之前,有必要对Spring Security的登录流程做个大致了解。

如果深入源码去了解,这个玩意及其复杂,但是没必要,知道它的机制就行了。就好比你买车也不必把发动机拆开去看它是怎么工作的吧。简单来说它就是下面这些步骤:

1、Spring Security通过AuthenticationManager接口进行身份验证

2、ProviderManager是AuthenticationManager的一个默认实现

3、ProviderManager把验证工作委托给了AuthenticationProvider接口

4、AuthenticationProvider的实现类DaoAuthenticationProvider会检查身份认证

5、DaoAuthenticationProvider又把认证工作委托给了UserDetailsService接口

6、自定义UserDetailsService类从数据库中获取用户账号、密码、角色等信息,然后封装成UserDetails返回

7、使用Spring Security还需要自定义AuthenticationProvider接口,获取用户输入的账号、密码等信息,并封装成Authentication接口

8、将UserDetails和Authentication进行比对,如果一致就返回UsernamePasswordAuthenticationToken,否则抛出异常

下面是认证流程图:

 

 

 

首先重写loadUserByUsername:

/**
 * 自定义用户详情
 *
 * @author 湘王
 */
@Service("userDetailsService")
public class CustomUserDetailsService implements UserDetailsService {
    @Autowired
    private UserService userService;
    @Autowired
    private RoleService roleService;
    @Autowired
    private UserRoleService userRoleService;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        Collection<GrantedAuthority> authorities = new ArrayList<>();
        // 从数据库中取出用户信息
        SysUser user = userService.getByName(username);
        // 判断用户是否存在
        if(null == user) {
            System.out.println("user is not exist");
            throw new UsernameNotFoundException("user is not exist");
        }

        // 获得用户角色:方式一
        List<SysUserRole> list = userRoleService.getByUserId(user.getId());
//        // 获得用户角色:方式二
//        List<SysRole> list = roleService.getByUserId(user.getId());

//        // 给用户添加授权:方式一
//        for (SysUserRole userRole : list) {
//            SysRole role = roleService.getById(userRole.getRoleid());
//            authorities.add(new SimpleGrantedAuthority(role.getName()));
//        }
//        // 返回UserDetails实现类
//        return new User(user.getName(), user.getPassword(), authorities);

        // 给用户添加授权:方式二
        return User
                .withUsername(username)
                .password(user.getPassword())
                .authorities(list.stream()
                                    .filter(Objects::nonNull)// 判断是否为空
                                    .map(userRole -> roleService.getById(userRole.getRoleid()))// 从SysUserRole获取Role
                                    .map(SysRole::getName)// 转变为角色名称字符串
                                    .map(SimpleGrantedAuthority::new)// 依据角色名称创建SimpleGrantedAuthority
                                    .toArray(SimpleGrantedAuthority[]::new)// list转变为数组
                ).build();
    }
}
hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » Spring Security(3)