shiro限制帐号只能在一处登录

shiro限制帐号只能在一处登录

只需要在subject.login(token);方法后加上这段代码
在这里插入图片描述

    private void getLoginSession(Subject currentUser) {
        //获取当前已登录的用户session列表
        Collection<Session> list = ((DefaultSessionManager) ((DefaultSecurityManager) SecurityUtils.getSecurityManager()).getSessionManager()).getSessionDAO().getActiveSessions();

        SysUserVo loginUser = (SysUserVo) currentUser.getPrincipal();
        //遍历所有的session
        for (Session session : list) {
            Subject s = new Subject.Builder().session(session).buildSubject();
            if (s.isAuthenticated()) {
                SysUserVo user = (SysUserVo) s.getPrincipal();
                //找到同一个账号
                if (user.getId().equalsIgnoreCase(loginUser.getId())) {
                	//找到同一个账号的 不同的session
                    if (!session.getId().equals(currentUser.getSession().getId())) {
                        //对同一个账号的其他人  进行强制退出
                        Subject requestSubject = new Subject.Builder().sessionId(session.getId()).buildSubject();
                        requestSubject.logout();
                    }
                }
            }
        }
    }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,需要在 pom.xml 文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring-boot-web-starter</artifactId> <version>1.6.0</version> </dependency> ``` 接着,在 application.yml 文件中配置 Shiro 和 LDAP 认证的相关信息: ```yaml shiro: ldap: url: ldap://localhost:10389 base: dc=example,dc=com userDnTemplate: uid={0},ou=people,dc=example,dc=com spring: ldap: urls: ldap://localhost:10389 base: dc=example,dc=com username: uid=admin,ou=system password: secret ``` 其中,url 配置的是 LDAP 服务器的地址和端口,base 是 LDAP 的根节点,userDnTemplate 则是用户节点的模板,用于根据用户名获取用户节点的 DN。 接下来,需要创建一个实现了 AuthenticationInfo 接口的类,用于获取用户的认证信息: ```java @Component public class LdapRealm extends AuthorizingRealm { @Autowired private LdapTemplate ldapTemplate; /** * 获取认证信息 * @param authenticationToken * @return * @throws AuthenticationException */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken; String username = token.getUsername(); String password = new String(token.getPassword()); // 根据用户名获取用户节点的 DN String userDn = ldapTemplate.lookup("uid=" + username, new String[]{"dn"}); // 验证用户密码 try { ldapTemplate.authenticate(userDn, "(objectClass=person)", password); } catch (AuthenticationException e) { throw new IncorrectCredentialsException("用户名或密码错误"); } return new SimpleAuthenticationInfo(username, password, getName()); } /** * 获取授权信息 * @param principalCollection * @return */ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { return null; } } ``` 这里使用了 Spring LDAP 的 LdapTemplate 进行 LDAP 认证,通过调用 authenticate 方法实现验证用户密码。 最后,在 WebSecurityConfig 配置类中开启 Shiro 和 LDAP 认证: ```java @Configuration @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private LdapRealm ldapRealm; @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/login").permitAll() .anyRequest().authenticated() .and() .formLogin().loginPage("/login").permitAll() .and() .logout().permitAll(); http.csrf().disable(); } @Override public void configure(WebSecurity web) throws Exception { web.ignoring() .antMatchers("/css/**", "/js/**", "/img/**"); } @Bean public ShiroFilterFactoryBean shiroFilterFactoryBean(DefaultWebSecurityManager securityManager) { ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); shiroFilterFactoryBean.setSecurityManager(securityManager); return shiroFilterFactoryBean; } @Bean public DefaultWebSecurityManager securityManager() { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealm(ldapRealm); return securityManager; } } ``` 在这里,我们通过 configure 方法配置了登录页面、退出页面和权限控制,通过 configure(WebSecurity web) 方法配置了静态资源的忽略,最后通过 shiroFilterFactoryBean 和 securityManager 方法开启 Shiro 和 LDAP 认证。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值