单点登录(SSO)通常以下步骤实现:
1.身份验证中心:建立一个身份验证中心(如OAuth2.0、OpenID Connect等),用于管理用户的认证和授权
2.用户登录:
用户在身份验证中心进行登录,输入凭证(如用户名和密码)
认证成功后,身份验证中心会生成一个令牌(Token)
3.令牌传递
用户访问其他应用时,应用会检查是否存在有效的令牌。
如果没有,用户会被重定向到身份验证中心进行验证
如果存在令牌,应用会向身份验证中心验证该令牌的有效性。
4.访问控制
一旦令牌被验证,用户将被允许访问请求的应用
应用可以根据令牌中的信息进行权限控制
5.注销
当用户在某个应用注销时,可以选择同时注销所有应用。
身份验证中心会处理注销请求,并使所有有效令牌失效。
技术实现
Spring Security:可以结合Spring Security和OAuth2来实现SSO
Redis:可以用来存储令牌,以便快速验证。
前端处理:在前端应用中,通常会使用JavaScript来处理令牌存储和发送。
Shiro
使用Apache Shiro实现单点登录(SSO)可以按照以下步骤进行:
1.配置Shiro:
在你的项目中添加Shiro依赖
创建shiro.ini或使用Java配置类来配置Realm,Session,Filter等
2.创建Realm:
自定义一个Realm来处理用户的身份验证和授权
在Realm中实现doGetAuthenticationInfo方法以验证用户凭证
3.集成Token
在身份验证中心登录时生成一个JWT或其他类型的Token,并返回给用户
将Token存储在客户端(如浏览器的localStorage)
4.Filter处理
创建一个自定义的Filter,用于拦截请求并检查Token
如果请求没有有效的Token,重定向用户到身份验证中心进行登录
5.跨应用共享Session
通过将Session存储在共享的Redis或数据库中,使得各个应用可以共享用户的登录状态。
6.注销处理
在注销时,使Token失效,清除Session
示例代码
public class CustomRealm extends AuthorizingRealm{
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException{
String username = (String) token.getPrincipal();
String password = (String) token.getCredentials();
// 验证用户凭证,返回 AuthenticationInfo
}
}
配置实例
[main]
# 配置 Realm
myRealm = com.example.CustomRealm
securityManager.realm = $myRealm
# 配置 Filter
jwt = com.example.JwtFilter
[urls]
/api/** = jwt