springSession+springSecurity结合使用实现redis管理session - Go语言中文社区

springSession+springSecurity结合使用实现redis管理session


springboot中使用security进行登录及权限控制可以查看之前的文章,springboot中使用spring-security进行登陆控制

此篇主要介绍在已经使用springsecuriy的项目中如何集成springsession,并利用redis进行session管理。

1. pom.xml

添加springsession的依赖:

<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-redis</artifactId>
    <version>${spring.boot.version}</version>
</dependency>

2. 进行springsession的redis配置

由于我application.yml中有使用jetcache进行远程redis连接配置,此处使用@value注解直接获取redis端口号等配置信息。进行jedis连接配置,还可以进行一些最大连接数的配置,这里我没有添加,使用默认的就好。

@Configuration
@EnableRedisHttpSession
public class SessionConfig {

    @Value("${jetcache.remote.default.host}")
    private String redisHost;

    @Value("${jetcache.remote.default.port}")
    private int redisPort;

    @Value("${jetcache.remote.default.password}")
    private String redisPwd;

    @Bean
    public JedisConnectionFactory connectionFactory() {
        RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
        redisStandaloneConfiguration.setHostName(redisHost);
        redisStandaloneConfiguration.setDatabase(0);
        redisStandaloneConfiguration.setPassword(RedisPassword.of(redisPwd));
        redisStandaloneConfiguration.setPort(redisPort);

        return new JedisConnectionFactory(redisStandaloneConfiguration);
    }
}

3. session配置

此处主要是将上面的redis配置添加到springsession中,使用刚才添加的redis进行sessino管理。

public class SecurityInitializer extends AbstractSecurityWebApplicationInitializer {
    public SecurityInitializer() {
        super(SessionConfig.class, Config.class);
    }
}

4. 查看redis

进行了以上的配置之后springsession就会将springsecurity的当前用户信息存放到redis中。

在这里插入图片描述

默认的ttl时间是2100s,即35分钟。

5. 获取redis中的当前用户

按照之前操作redis的惯例,我们需要一个key从redis中获取value,这里要获取的value就是之前我们存放在redis中的用户信息。那么这个key是什么呢?

我们不需要自己去拿key到redis中查询用户信息,security框架会根据sessionId帮我们去redis中取。我们要做的就是获取securityContext对象中

public void getCurrentUser() {
    Authentication auth = SecurityContextHolder.getContext().getAuthentication();
    Object myUser = (auth != null) ? auth.getPrincipal() : null;

    if (myUser instanceof UserVO) {
        UserVO user = (UserVO) myUser;
        return user;
    } else {
        log.error("当前用户不存在,请重新登录");
        throw new UsernameNotFoundException("当前用户不存在!");
    }
}

这里的userVo对象需要是之前实现了UserDetails接口的对象:

/**
 * @Description spring-security的user对象
 * @Author LiuYue
 * @Date 2019/3/6
 * @Version 1.0
 */
@Data
public class UserVO implements UserDetails {

    /**
     * 用户ID
     */
    private String userId;

    /**
     * 用户账号
     */
    private String user;

    /**
     * 用户名
     */
    private String userName;

    /**
     * 密码
     */
    private String password;

    /**
     * 是否为回收站,0表示不是,1表示是
     */
    private String isRecycle;

    /**
     * 是否可用。Y表示可用,N表示不可用
     */
    private String isEnable;

    /**
     * 创建人
     */
    private String createBy;

    /**
     * 创建时间
     */
    private Date createTime;

    /**
     * 更新人
     */
    private String updateBy;

    /**
     * 更新时间
     */
    private Date updateTime;

    /**
     * 备注
     */
    private String comment;

    /**
     * 用户角色
     **/
    private List<TtRole> roles;


    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        List<GrantedAuthority> authorities = new ArrayList<>();
        for (TtRole role : roles) {
            authorities.add(new SimpleGrantedAuthority("ROLE_"+role.getRole()));
        }
        return authorities;
    }

    @Override
    public String getUsername() {
        return userName;
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {

        return "y".equals(isEnable)  ;
    }

}

总结

以上就是springsession与springsecurity结合使用,并使用redis管理session的全部内容了。

用redis管理session的好处就是多个模块之间可以实现session共享。在其他模块我们也可以使用这种方式获取当前的用户信息。

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/nb7474/article/details/88696254
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢