单点登录主要问题在于多台服务器集群时,用户登录身份信息在每台服务器上是否能够保证都存在或者进行身份识别。
常用一下三种方式解决:
1、tomcat session 复制(服务器集群数量很多时,服务器之间相互复制,性能开销很大)
2、spring session session共享(有状态服务)
<!-- spring session的过滤器配置,注意此过滤器必须放在其他过滤器之前 -->
<filter>
<filter-name>springSessionRepositoryFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSessionRepositoryFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<bean class="org.springframework.scheduling.concurrent.ConcurrentTaskScheduler"></bean>
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxIdle" value="10" />
<property name="maxTotal" value="20" />
<property name="blockWhenExhausted" value="true" />
<property name="maxWaitMillis" value="1000" />
<property name="testOnBorrow" value="true" />
</bean>
<bean id="jedisConnectionFactory"
class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
p:host-name="192.168.126.11" p:port="6379" p:password="" p:usePool="true"
p:pool-config-ref="jedisPoolConfig">
</bean>
<bean
class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">
<property name="maxInactiveIntervalInSeconds" value="30"></property>
</bean>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
<version>2.0.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.4.2</version>
</dependency>
import javax.servlet.http.HttpServletRequest;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class IndexController {
@RequestMapping("/index")
@ResponseBody
public String index(HttpServletRequest request,@Param(value = "name") String name,@Param(value = "password") String password) {
request.getSession().setAttribute(name, password);
return "success";
}
@GetMapping("/getPassword")
@ResponseBody
public String getPassword(HttpServletRequest request,@Param(value = "name") String name) {
return String.valueOf(request.getSession().getAttribute(name));
}
}
3、jwt (JSON Web Token)(无状态服务,分布式系统中常用方案)
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.4.0</version>
</dependency>
import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.gupao.model.User;
public class JwtTokenUtils {
public static String getToken(User user) {
String token=JWT.create().withAudience(user.getId()+"").sign(Algorithm.HMAC256(user.getPassword()));
return token;
}
}
import java.lang.reflect.Method;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.gupao.controller.BaseController;
import com.gupao.jwt.PassToken;
import com.gupao.jwt.UserLoginToken;
import com.gupao.model.User;
import com.gupao.service.UserService;
public class TokenInterceptor implements HandlerInterceptor {
@Autowired
UserService userService;
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
String token = request.getHeader("token");
if (!(handler instanceof HandlerMethod)) {
return true;
}
HandlerMethod handlerMethod = (HandlerMethod) handler;
Method method = handlerMethod.getMethod();
if (method.isAnnotationPresent(PassToken.class)) {
PassToken passToken = method.getAnnotation(PassToken.class);
if (passToken.required()) {
return true;
}
}
// if(method.isAnnotationPresent(UserLoginToken.class)) {
// UserLoginToken userLoginToken=method.getAnnotation(UserLoginToken.class);
// if(userLoginToken.required()) {
if(token==null) {
throw new RuntimeException("无token,请重新登录!");
}
String uid=JWT.decode(token).getAudience().get(0);
Integer userId=Integer.valueOf(uid);
User user=userService.findUserById(userId);
if(user==null) {
throw new RuntimeException("用户不存在!");
}
JWTVerifier verifier=JWT.require(Algorithm.HMAC256(user.getPassword())).build();
try {
verifier.verify(token);
Object bean=handlerMethod.getBean();
if(bean instanceof BaseController) {
BaseController baseController=(BaseController) bean;
baseController.setUid(user.getId()+"");
}
} catch (Exception e) {
throw new RuntimeException("401");
}
return true;
// }
// }
// return true;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
}
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface PassToken {
boolean required() default true;
}
分享到:
相关推荐
cas 单点登录解决方案 cas 单点登录解决方案是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。随着企业的发展,业务系统的数量...
### SSO单点登录解决方案详解 #### 一、单点登录概述 单点登录(Single Sign-On,简称SSO)是一种先进的解决方案,旨在通过让用户仅需登录一次即可访问所有相互信任的应用系统,从而提高用户体验并简化安全管理。...
SSO 单点登录解决方案 设计流程图 SSO(Single Sign-On)单点登录解决方案是当前企业应用系统中最常用的身份验证机制之一。该解决方案的设计流程图将会详细介绍 SSO 的实现机制、时序图、数据库设计、程序实现和...
一种轻量级的跨域单点登录解决方案 本文提出了一种轻量级的跨域单点登录解决方案,旨在解决现有单点登录系统设计复杂、实施困难等问题。该方案利用JavaScript和XML技术手段实现,通过在登录中心生成带有登录信息的...
总的来说,单点登录解决方案的架构与实现涉及了身份验证、安全通信、协议标准化等多个方面,它的目的是提供一种高效且安全的方式来管理用户在多应用环境下的登录体验。在实际部署中,需要根据具体业务需求和安全标准...
在本主题中,我们将深入探讨如何构建和实现基于CAS(Central Authentication Service)的单点登录解决方案。 CAS是一个开源的SSO框架,它提供了安全的身份验证服务,使得用户只需一次登录即可访问多个应用。其核心...
总的来说,CAS作为单点登录解决方案,以其灵活性、安全性及易用性在IT领域得到广泛应用,帮助企业或组织构建高效的身份验证管理体系。了解并掌握CAS的原理和实践,对于提升系统的用户体验和安全管理具有重要意义。
在这个“JWT实现单点登录解决方案demo”中,我们主要探讨如何使用JWT来创建一个SSO系统。 JWT由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。头部通常包含令牌的类型(JWT)和算法(如HS256或...
综上所述,构建基于SOA框架的单点登录解决方案是一项复杂但必要的任务,它不仅提升了用户体验,也强化了系统的安全性。通过合理设计和实施,SSO可以成为企业级应用系统中不可或缺的一部分。在实际项目中,需要根据...
### 单点登录解决方案介绍 #### 一、单点登录概念及基本流程 单点登录(Single Sign-On,简称SSO)是一种常见的企业级身份管理技术,它允许用户通过一次认证即可访问所有相互信任的应用系统,无需多次重复登录。...
SSO(Single Sign-On)单点登录是一种身份验证机制,允许...总的来说,SSO单点登录解决方案是现代企业IT环境中必不可少的组件,它提升了用户便利性,降低了管理成本,加强了安全性,并适应了SOA环境下的服务安全需求。
### 单点登录解决方案概述 #### 一、什么是单点登录(Single Sign-On, SSO) 单点登录(Single Sign-On,简称SSO)是一种基于Web的应用系统认证机制,允许用户通过一次登录即可访问所有相互信任的应用系统。简单来说...