java实现简单的单点登录(4)
下面是登录模块DesktopSSOLoginModule的主体:login()方法。
逻辑也是非常简单:先用Cookie来登陆,如果成功,则直接就进入系统,否则需要用户输入用户名和密码来登录系统。
public boolean login() throws LoginException{try {if (Cookielogin()) return true;} catch (IOException ex) {ex.printStackTrace();}if (passwordlogin()) return true;throw new FailedLoginException();}下面是Cookielogin()方法的实体,它的逻辑是:先从Cookie文件中获得相应的Cookie值,通过身份效验服务效验Cookie的有效性。
如果cookie有效就算登录成功;如果不成功或Cookie不存在,用cookie登录就算失败。
public boolean Cookielogin() throws LoginException,IOException { String cookieValue="";int cookieIndex =foundCookie();if (cookieIndex<0)return false;elsecookieValue = getCookieValue(cookieIndex);username = cookieAuth(cookieValue);if (! username.equals("failed")) {loginSuccess = true;return true;}return false;}用用户名和密码登录的方法要复杂一些,通过Callback的机制和屏幕输入输出进行信息交互,完成用户登录信息的获取;获取信息以后通过userAuth方法来调用远端SSOAuth的服务来判定当前登录的有效性。
public boolean passwordlogin() throws LoginException {//// Since we need input from a user, we need a callback handler if (callbackHandler == null) {throw new LoginException("No CallbackHandler defined");}Callback[] callbacks = new Callback[2];callbacks[0] = new NameCallback("Username");callbacks[1] = new PasswordCallback("Password", false);//// Call the callback handler to get the username and password try {callbackHandler.handle(callbacks);username = ((NameCallback)callbacks[0]).getName();char[] temp = ((PasswordCallback)callbacks[1]).getPassword(); password = new char[temp.length];System.arraycopy(temp, 0, password, 0, temp.length);((PasswordCallback)callbacks[1]).clearPassword();} catch (IOException ioe) {throw new LoginException(ioe.toString());} catch (UnsupportedCallbackException uce) {throw new LoginException(uce.toString());}System.out.println();String authresult ="";try {authresult = userAuth(username, password);} catch (IOException ex) {ex.printStackTrace();}if (! authresult.equals("failed")) {loginSuccess= true;clearPassword();try {updateCookie(authresult);} catch (IOException ex) {ex.printStackTrace();}return true;loginSuccess = false;username = null;clearPassword();System.out.println( "Login: PasswordLoginModule FAIL" );throw new FailedLoginException();}CookieAuth和userAuth方法都是利用apahce的httpclient工具包和远程的SSOAuth进行http连接,获取服务。
private String cookieAuth(String cookievalue) throws IOException{ String result = "failed";HttpClient httpclient = new HttpClient();GetMethod httpget = newGetMethod(SSOServiceURL+Action1+cookievalue);try {httpclient.executeMethod(httpget);result = httpget.getResponseBodyAsString();} finally {httpget.releaseConnection();}return result;}private String userAuth(String username, char[] password) throws IOException{String result = "failed";String passwd= new String(password);HttpClient httpclient = new HttpClient();GetMethod httpget = newGetMethod(SSOServiceURL+Action2+username+"&password="+passwd);passwd = null;try {httpclient.executeMethod(httpget);result = httpget.getResponseBodyAsString();} finally {httpget.releaseConnection();}return result;}还有一个地方需要补充说明的是,在本样例中,用户名和密码的输入都会在屏幕上显示明文。
如果希望用掩码形式来显示密码,以提高安全性,请参考:/developer/technicalArticles/Security/pwordmask/4 当前方案的安全局限性当前这个WEB-SSO的方案是一个比较简单的雏形,主要是用来演示SSO的概念和说明SSO技术的实现方式。
有很多方面还需要完善,其中安全性是非常重要的一个方面。
我们说过,采用SSO技术的主要目的之一就是加强安全性,降低安全风险。
因为采用了SSO,在网络上传递密码的次数减少,风险降低是显然的,但是当前的方案却有其他的安全风险。
由于cookie是一个用户登录的唯一凭据,对cookie 的保护措施是系统安全的重要环节:∙cookie的长度和复杂度在本方案中,cookie是有一个固定的字符串(我的姓名)加上当前的时间戳。
这样的cookie很容易被伪造和猜测。
怀有恶意的用户如果猜测到合法的cookie 就可以被当作已经登录的用户,任意访问权限范围内的资源∙cookie的效验和保护在本方案中,虽然密码只要传输一次就够了,可cookie在网络中是经常传来传去。
一些网络探测工具(如sniff, snoop,tcpdump等)可以很容易捕获到cookie 的数值。
在本方案中,并没有考虑cookie在传输时候的保护。
另外对cookie的效验也过于简单,并不去检查发送cookie的来源究竟是不是cookie最初的拥有者,也就是说无法区分正常的用户和仿造cookie的用户。
∙当其中一个应用的安全性不好,其他所有的应用都会受到安全威胁因为有SSO,所以当某个处于 SSO的应用被黒客攻破,那么很容易攻破其他处于同一个SSO保护的应用。
这些安全漏洞在商业的SSO解决方案中都会有所考虑,提供相关的安全措施和保护手段,例如Sun公司的Access Manager,cookie的复杂读和对cookie的保护都做得非常好。
另外在OpneSSO (https://)的架构指南中也给出了部分安全措施的解决方案。
5 当前方案的功能和性能局限性除了安全性,当前方案在功能和性能上都需要很多的改进:∙当前所提供的登录认证模式只有一种:用户名和密码,而且为了简单,将用户名和密码放在内存当中。
事实上,用户身份信息的来源应该是多种多样的,可以是来自数据库中,LDAP中,甚至于来自操作系统自身的用户列表。
还有很多其他的认证模式都是商务应用不可缺少的,因此SSO的解决方案应该包括各种认证的模式,包括数字证书,Radius, SafeWord ,MemberShip,SecurID 等多种方式。
最为灵活的方式应该允许可插入的JAAS框架来扩展身份认证的接口∙我们编写的Filter只能用于J2EE的应用,而对于大量非Java的Web应用,却无法提供SSO服务。
∙在将Filter应用到Web应用的时候,需要对容器上的每一个应用都要做相应的修改,重新部署。
而更加流行的做法是Agent机制:为每一个应用服务器安装一个agent,就可以将SSO功能应用到这个应用服务器中的所有应用。
∙当前的方案不能支持分别位于不同domain的Web应用进行SSO。
这是因为浏览器在访问Web服务器的时候,仅仅会带上和当前web服务器具有相同domain名称的那些cookie。
毕业论文:基于JAVA的酒店管理系统的设计与实现
基于JAVA的酒店管理系统的设计与实现摘要进入新世纪后我国的经济增长迅速,人们的生活质量不断提高,带动旅游业高速发展,与其相对于的酒店服务行业,迫切需要提高档次。
而酒店管理系统具有强大的管理功能,完美实现了宾馆各个方面的管理需求。
酒店宾馆作为一个服务性行业,从客房的营销即客人的预定开始,到入住登记直到最后退房结账,整个过程应该能够体现以宾客为中心,提供快捷方便服务,给宾客感受一种顾客至上的享受,提高管理水平,简化各种复杂操作,要包含了:查询,结算,统计凭证规范等,在最短时间内完成酒店业务规范操作,这样才能令旅客舒适难忘。
本文论述了酒店管理系统的设计和实现。
并基于B/S架构,使用JAVA 编程前台, SQLSever2005开发后台的数据库,用前台和后台结合的方式开发下开发了酒店管理系统。
系统的主要功能包括散客开单、宾客结帐、客房预订、营业查询、客户管理、网络设置、系统设置等,操作方便快捷实现了可利用住房资源的可视化,可及时查阅 ,记录等功能。
提高酒店的管理效率,改善服务水准的手段,满足了顾客和酒店管理员的需求。
这样旅客入住的所等待的时间就会减少,而酒店能更好的处理旅客入住的相关手续,为酒店管理提供方便。
关键词:java;B/S架构;SQL server2005;酒店管理ABSTRACTAfter entering the new century our country's rapid economic growth, people's quality of life, driving the development of tourism highway, and its relative to the hotel service industry, the urgent need to improve the grade. Hotel management system has powerful function, perfect for various aspects of the hotel management needs.This paper discusses the design and implementation of the hotel management system. And based on B/S structure, using JAVA programming at the front desk, SQLSever2005 database development background, combined with the front desk and the background of the hotel management system is developed under way to develop. System's main features include individual billing, guests checkout, room reservations, business inquiries, customer management, network Settings, system Settings, etc., should be able to reflect the whole process to the guests as the center, provide quick and convenient services, to the guests feel a kind of the enjoyment of the customer is supreme, improve the level of management, simplifying the complex operation, mainly includes: the query, settlement, statistics, etc., in the shortest possible time to complete specifications, such as the operation of hotel management operation convenient to realize the visualization of housingresources available, can be found in a timely manner, records, and other functions. Improve the efficiency of the hotel management, improve service levels, meet the needs of the customer and the hotel manager. So that passengers in the waiting time would be reduced, and the hotel can better handle the passenger check-in formalities, provide convenience for hotel management.Keywords: Java, B/S architecture, SQL server2005 and hotel management第1章绪论1.1系统开发的背景和现状21世纪,全球网络化,科技在突飞猛进。
springboot1.5.4集成shiro+cas,实现单点登录和权限控制
springboot1.5.4集成shiro+cas,实现单点登录和权限控制1.添加maven依赖(先安装好cas-server-3.5.2,安装步骤请查看本⽂参考⽂章)<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><version>1.2.4</version></dependency><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-ehcache</artifactId><version>1.2.4</version></dependency><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-cas</artifactId><version>1.2.4</version></dependency>2.启动累添加@ServletComponentScan注解@SpringBootApplicationpublic class Application {/*** main function* @param args params*/public static void main(String[] args){ConfigurableApplicationContext context = SpringApplication.run(Application.class,args);//test if a xml bean inject into springcontext successfulUser user = (User)context.getBean("user1");System.out.println(JSONObject.toJSONString(user));}}3.配置shiro+caspackage com.hdwang.config.shiroCas;import erDao;import org.apache.shiro.cache.ehcache.EhCacheManager;import org.apache.shiro.cas.CasFilter;import org.apache.shiro.cas.CasSubjectFactory;import org.apache.shiro.spring.LifecycleBeanPostProcessor;import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;import org.apache.shiro.spring.web.ShiroFilterFactoryBean;import org.apache.shiro.web.filter.authc.LogoutFilter;import org.apache.shiro.web.mgt.DefaultWebSecurityManager;import org.jasig.cas.client.session.SingleSignOutFilter;import org.jasig.cas.client.session.SingleSignOutHttpSessionListener;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.boot.web.servlet.FilterRegistrationBean;import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.core.Ordered;import org.springframework.web.filter.DelegatingFilterProxy;import javax.servlet.Filter;import javax.servlet.annotation.WebListener;import java.util.HashMap;import java.util.LinkedHashMap;import java.util.Map;/*** Created by hdwang on 2017/6/20.* shiro+cas 配置*/@Configurationpublic class ShiroCasConfiguration {private static final Logger logger = LoggerFactory.getLogger(ShiroCasConfiguration.class);// cas server地址public static final String casServerUrlPrefix = "https://localhost:8443/cas";// Cas登录页⾯地址public static final String casLoginUrl = casServerUrlPrefix + "/login";// Cas登出页⾯地址public static final String casLogoutUrl = casServerUrlPrefix + "/logout";// 当前⼯程对外提供的服务地址public static final String shiroServerUrlPrefix = "http://localhost:8081";// casFilter UrlPatternpublic static final String casFilterUrlPattern = "/cas";// 登录地址public static final String loginUrl = casLoginUrl + "?service=" + shiroServerUrlPrefix + casFilterUrlPattern;// 登出地址public static final String logoutUrl = casLogoutUrl+"?service="+shiroServerUrlPrefix;// 登录成功地址public static final String loginSuccessUrl = "/home";// 权限认证失败跳转地址public static final String unauthorizedUrl = "/error/403.html";@Beanpublic EhCacheManager getEhCacheManager() {EhCacheManager em = new EhCacheManager();em.setCacheManagerConfigFile("classpath:ehcache-shiro.xml");return em;}@Bean(name = "myShiroCasRealm")//realm.setCasServerUrlPrefix(ShiroCasConfiguration.casServerUrlPrefix);// 客户端回调地址//realm.setCasService(ShiroCasConfiguration.shiroServerUrlPrefix + ShiroCasConfiguration.casFilterUrlPattern);return realm;}/*** 注册单点登出listener* @return*/@Beanpublic ServletListenerRegistrationBean singleSignOutHttpSessionListener(){ServletListenerRegistrationBean bean = new ServletListenerRegistrationBean();bean.setListener(new SingleSignOutHttpSessionListener());// bean.setName(""); //默认为bean namebean.setEnabled(true);//bean.setOrder(Ordered.HIGHEST_PRECEDENCE); //设置优先级return bean;}/*** 注册单点登出filter* @return*/@Beanpublic FilterRegistrationBean singleSignOutFilter(){FilterRegistrationBean bean = new FilterRegistrationBean();bean.setName("singleSignOutFilter");bean.setFilter(new SingleSignOutFilter());bean.addUrlPatterns("/*");bean.setEnabled(true);//bean.setOrder(Ordered.HIGHEST_PRECEDENCE);return bean;}/*** 注册DelegatingFilterProxy(Shiro)** @return* @author SHANHY* @create 2016年1⽉13⽇*/@Beanpublic FilterRegistrationBean delegatingFilterProxy() {FilterRegistrationBean filterRegistration = new FilterRegistrationBean();filterRegistration.setFilter(new DelegatingFilterProxy("shiroFilter"));// 该值缺省为false,表⽰⽣命周期由SpringApplicationContext管理,设置为true则表⽰由ServletContainer管理filterRegistration.addInitParameter("targetFilterLifecycle", "true");filterRegistration.setEnabled(true);filterRegistration.addUrlPatterns("/*");return filterRegistration;}@Bean(name = "lifecycleBeanPostProcessor")public LifecycleBeanPostProcessor getLifecycleBeanPostProcessor() {return new LifecycleBeanPostProcessor();}@Beanpublic DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator() {DefaultAdvisorAutoProxyCreator daap = new DefaultAdvisorAutoProxyCreator();daap.setProxyTargetClass(true);return daap;}@Bean(name = "securityManager")public DefaultWebSecurityManager getDefaultWebSecurityManager(MyShiroCasRealm myShiroCasRealm) {DefaultWebSecurityManager dwsm = new DefaultWebSecurityManager();dwsm.setRealm(myShiroCasRealm);// <!-- ⽤户授权/认证信息Cache, 采⽤EhCache 缓存 -->dwsm.setCacheManager(getEhCacheManager());// 指定 SubjectFactorydwsm.setSubjectFactory(new CasSubjectFactory());return dwsm;}@Beanpublic AuthorizationAttributeSourceAdvisor getAuthorizationAttributeSourceAdvisor(DefaultWebSecurityManager securityManager) { AuthorizationAttributeSourceAdvisor aasa = new AuthorizationAttributeSourceAdvisor();aasa.setSecurityManager(securityManager);return aasa;}/*** CAS过滤器** @return* @author SHANHY* @create 2016年1⽉17⽇*/@Bean(name = "casFilter")public CasFilter getCasFilter() {CasFilter casFilter = new CasFilter();casFilter.setName("casFilter");casFilter.setEnabled(true);// 登录失败后跳转的URL,也就是 Shiro 执⾏ CasRealm 的 doGetAuthenticationInfo ⽅法向CasServer验证tiketcasFilter.setFailureUrl(loginUrl);// 我们选择认证失败后再打开登录页⾯return casFilter;}/*** ShiroFilter<br/>* 注意这⾥参数中的 StudentService 和 IScoreDao 只是⼀个例⼦,因为我们在这⾥可以⽤这样的⽅式获取到相关访问数据库的对象, * 然后读取数据库相关配置,配置到 shiroFilterFactoryBean 的访问规则中。
java整合discuz单点登录邹颢的博客
java整合discuz单点登录邹颢的博客java里没有好的论坛,唯一好的大概就是jsprun,这个是仿discuz 论坛,不过貌似团队不做了,也停止了更新了最近项目里需要一个论坛,碰巧我以前是做php的,对于discuz ucenter以前也做过单点登录,于是开始把discuz整合进项目中.首先先安装ucenter,与discuz整合,如果不知道ucenter是什么?请自行百度.现在的discuz项目直接下载下来在安装的时候会让你选择是否整合进ucenter,选择是就行了,如果是已经的论坛请自行整合进ucenter.java项目中有人已经编写了discuz-ucenter-for-java.我们用这个插件就可以实现java与php的对接的先去https:///p/discuz-ucenter-api-for-java/downloads/list下载discuz-api-for-java..本人的环境:apache-php :80端口java:8080端口网上也可以把php整合进tomcat,让php和java都用同一个端口,具体方法我就不讲述我这里php和java分别用的是2个端口工具都差不多了.下面开始步骤了.1:进入ucenter后台.ucenter->应用管理->添加新应用2:填写应用名称,应用的主url,通讯密钥,勾上开启同步登陆.,其他的都可以不填.创建好后,记录应用ID3:将discuz-ucenter-api-for-java 加入到项目中,配置web.xml Java1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <!-- discuz 论坛ucenter 整合 --><servlet><servlet-name>api</servlet-name><servlet-class>com.fivestars.interfaces.bbs.api.UC</servlet-class><load-on-startup>2</load-on-startup></servlet><servlet-mapping><servlet-name>api</servlet-name><url-pattern>/api/uc.php</url-pattern></servlet-mapping><!-- discuz 论坛ucenter 整合 -->4:配置config.propertiesPHP1 2 3 4 5 UC_API = http://localhost/discuz/uc_server UC_IP = UC_KEY =x2ydu036Ubtf55gfyf2bR7Mc62v2a7J7rcrdA9Ncx259B323wegb87P5l7CaYd34 UC_APPID = 2 UC_CONNECT =UC_API 就是ucenter 的路径UC_IP 可以不填,会自动根据域名解析该IPUC_KEY 就是通讯密钥UC_APPID 就是ucenter 添加应用的ID配好就可以,通讯就应该成功了.如果不成功,请添加ip.还有注意config.properties 的路径,我是自己修改了名字和路径..修改路径的话记得去Client.java 里修改路径,因为它这里会读取config.properties接下来就是关于discuz-api-for-java 的一些api1:同步注册Java1 2 3 4 5 6 7 8 9 10 11Client discuzClient = new Client(); discuzClient.uc_user_register("zhangsan","password","zouhao619@gma "); /** -1 : 用户名不合法 -2 : 包含不允许注册的词语 -3 : 用户名已经存在 -4 : email 格式有误 -5 : email 不允许注册 -6 : 该 email 已经被注册 >1 : 表示成功,数值为 UID */ 2:同步登陆Java1 2 3 4 5 6 Client discuzClient = new Client();String loginResult = discuzClient.uc_user_login("zhangsan","password");//根据账户密码获取用户相关信息 LinkedList<String> userInfo=XMLHelper.uc_unserialize(loginResult); uid=Integer.valueOf(userInfo.get(0));//获取用户的ID String $ucsynlogin = discuzClient.uc_user_synlogin(uid);//根据ID 进行同步登陆 response.getWriter().print($ucsynlogin);//把$ucsynlogin 输出到页面上就行了.这样就实现了同步登陆,实际上就是一个script 标签可以进行跨域的功能注意事项:1:ucenter->注册设置->是否允许同一个email 注册多个用户根据自己的实际情况来决定2:同步注册后,需要到discuz 登录一次,才能实现同步登录.如果进行同步注册后,账户没有登录,那么也无法实现同步登录,如果你要实现同步注册后,就能登录.就修改uc_server/model/user.php 第129行左右的add_user($username, $password, $email, $uid = 0, $questionid = ”, $answer = ”, $regip = ”)方法修改为如下内容:PHP1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 function add_user($username, $password, $email, $uid = 0, $questionid = '', $answer = '', $regip = '') {$regip = empty($regip) ? $this->base->onlineip : $regip;$salt = substr(uniqid(rand()), -6);$password = md5(md5($password).$salt); $sqladd = $uid ? "uid='".intval($uid)."'," : ''; $sqladd .= $questionid > 0 ? " secques='".$this->quescrypt($questionid, $answer)."'," : " secques='',"; $this->db->query("INSERT INTO ".UC_DBTABLEPRE."members SET $sqladd username='$username', password='$password', email='$email', regip='$regip', regdate='".$this->base->time."', salt='$salt'"); $uid = $this->db->insert_id(); $this->db->query("INSERT INTO ".UC_DBTABLEPRE."memberfields SET uid='$uid'"); //begin $this->db->query("INSERT INTO `discuz`.dz_common_member SET uid='$uid', username='$username', password='$password', email='$email', adminid='0', groupid='10', regdate='".$this->base->time."', credits='0', timeoffset='9999'"); $this->db->query("INSERT INTO `discuz`.dz_common_member_status SET uid='$uid', regip='$regip', lastip='$regip', lastvisit='".$this->base->time."', lastactivity='".$this->base->time."', lastpost='0', lastsendmail='0'");$this->db->query("INSERT INTO `discuz`.dz_common_member_profile SET uid='$uid'");$this->db->query("INSERT INTO`discuz`.dz_common_member_field_forum SET uid='$uid'");$this->db->query("INSERT INTO `discuz`.dz_common_member_field_home SET uid='$uid'");$this->db->query("INSERT INTO `discuz`.dz_common_member_count SET uid='$uid', extcredits1='0', extcredits2='0', extcredits3='0', extcredits4='0', extcredits5='0', extcredits6='0', extcredits7='0', extcredits8='0'");//endreturn $uid;}在添加到ucenter 的同时添加到discuz 表中.3:如果你要实现同步登录,在页面输出discuzClient.uc_user_synlogin(uid),他其实是一段script,用来跨域访问的.但是有可能由于网络原因,你还没有发出这个请求,你就先跳转页面了.所以造成无法同步登录.我用的方法是,用jquery.$.script()方法来加载这个js,由于是跨域,$.script()无法有返回,这个时候需要在php 服务器端设置PHP1 header("Access-Control-Allow-Origin:*"); //允许任何访问(包括ajax 跨域)详细代码如下:JavaScript1 2 3 4 5 6 7 <script>$(function(){$.getScript('script 的目标url', function(){location.href='bbs 路径';});});</script>确定执行完了这个js 同步登录后,在执行location 进行跳转。
springboot如何基于JWT实现单点登录详解
springboot如何基于JWT实现单点登录详解前⾔最近我们组要给负责的⼀个管理系统 A 集成另外⼀个系统 B,为了让⽤户使⽤更加便捷,避免多个系统重复登录,希望能够达到这样的效果——⽤户只需登录⼀次就能够在这两个系统中进⾏操作。
很明显这就是单点登录(Single Sign-On)达到的效果,正好可以明⽬张胆的学⼀波单点登录知识。
本篇主要内容如下:SSO 介绍SSO 的⼏种实现⽅式对⽐基于 JWT 的 spring boot 单点登录实战注意:SSO 这个概念已经出现很久很久了,⽬前各种平台都有⾮常成熟的实现,⽐如OpenSSO,OpenAM,Kerberos,CAS等,当然很多时候成熟意味着复杂。
本⽂不讨论那些成熟⽅案的使⽤,也不考虑 SSO 在 CS 应⽤中的使⽤。
什么是 SSO单点点说就是:⼀次登录后可免登陆访问其他的可信平台。
⽐如我们登录淘宝⽹后,再打开天猫⾸页可以发现已经是登录状态了。
SSO 是⼀种⽐较流⾏的服务于企业业务整合的⼀种解决⽅案。
如何实现 SSO我们都知道⽬前的 http 协议是⽆状态的,也就是第⼀次请求和第⼆次请求是完全独⽴,不相关的,但现实中我们的业务逻辑都是有状态的,这样就引⼊了 cookie-session 的机制来维护状态,浏览器端存储⼀个 sessionId,后台存储跟该 sessionId 相关的数据。
每次向后台发起请求时都携带此 sessionId 就能维持状态了。
然后就有了 cookie,浏览器在发送请求时⾃动将cookie 中的数据放到请求中,发给服务端,⽆需⼿动设置。
然后我们可以考虑考虑实现 SSO 的核⼼是什么?答案就是如何让⼀个平台 A 登录后,其他的平台也能获取到平台 A 的登录信息(在 cookie-session 机制中就是 sessionId)。
⽅案⼀共享 cookie基于 cookie-session 机制的系统中,登录系统后会返回⼀个 sessionId 存储在 cookie 中,如果我们能够让另外⼀个系统也能获取到这个 cookie,不就获取到凭证信息了,⽆需再次登录。
java 单点登录实现方案
java 单点登录实现方案Java单点登录(Single Sign-On,简称SSO)是一种身份验证机制,允许用户使用一组凭据(如用户名和密码)登录到多个相关的应用程序或系统,而无需在每个应用程序中单独进行身份验证。
本文将介绍Java单点登录的实现方案。
在实现Java单点登录时,可以采用以下方案:1. 基于Token的认证方案:这是目前较为常见的单点登录实现方案之一。
用户在登录成功后,后台生成一个Token,将其返回给用户,并存储在服务器端。
用户在访问其他应用程序时,将Token作为身份凭证发送到服务器端进行验证。
服务器端通过验证Token的有效性来判断用户的身份。
常见的Token生成方式包括JWT(JSON Web Token)和OAuth2.0。
2. 基于代理的认证方案:该方案使用一个代理服务器来处理用户的身份验证。
用户在登录成功后,代理服务器会为用户生成一个身份标识,并将其存储在Cookie中。
当用户访问其他应用程序时,请求会先发送到代理服务器,代理服务器会验证用户的身份,并将请求转发给相应的应用程序。
3. 基于Session的认证方案:该方案使用Java的Session机制来实现单点登录。
用户在登录成功后,后台会为用户创建一个Session,并将Session的ID存储在Cookie中。
当用户访问其他应用程序时,应用程序会通过Cookie中的Session ID来验证用户的身份。
无论采用哪种方案,Java单点登录的实现步骤大致相同:1. 用户登录:用户在登录页面输入用户名和密码进行登录。
后台验证用户的凭据是否正确,如果正确则进行下一步操作。
2. 生成身份凭证:在用户登录成功后,后台会生成一个身份凭证(Token、身份标识或Session),并将其返回给用户。
3. 存储身份凭证:服务器端会将生成的身份凭证存储起来,可以存储在数据库、缓存或服务器内存中。
4. 跨应用程序身份验证:当用户访问其他应用程序时,应用程序会验证用户的身份凭证的有效性。
Java代码实现jira单点登录
b) 获取 cookie 的方式
package com.atlassian.jira.security.cuslogin; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; public class SSOnCookie { private final String PORTAL_COOKIE_KEY = "JIRA_USER_NAME_KEY"; private HttpServletRequest request = null; public static SSOnCookie getSSOCookie(HttpServletRequest request) { SSOnCookie cookie = new SSOnCookie(); cookie.request = request; return cookie; } public boolean isExpired() { Cookie[] cookies = request.getCookies(); System.out.println("cookie"+cookies); if (null == cookies || cookies.length == 0) return true; System.out.println("cookie length:"+cookies.length); for (Cookie cookie : cookies) { System.out.println("cookie name:"+cookie.getName());
Java 代码实现 jira 单点登录
单点登录的几种实现方式
单点登录的几种实现方式单点登录(Single Sign-On,简称SSO)是一种常见的身份验证机制,允许用户在一个平台上登录后,无需再次输入用户名和密码即可访问其他关联的认证系统。
以下是单点登录的几种实现方式:1. SAML(安全断言标记语言)* SAML是一种基于XML的标准,用于在不同安全系统之间交换认证和授权信息。
* 当用户在一个支持SAML的网站上登录时,网站会生成一个包含用户身份信息的SAML 断言(assertion),并将其发送给身份提供者(Identity Provider)。
* 身份提供者验证用户的身份后,将SAML断言转发给目的网站,以允许用户访问。
* SAML支持单点登录和单点登出功能,并且可以与多种身份管理系统集成。
2. OAuth(开放授权)* OAuth是一种基于令牌的身份验证协议,允许第三方应用程序访问用户在另一个服务提供商上的受保护资源,而不需要共享用户的凭据。
* 当用户授权第三方应用程序访问其受保护资源时,服务提供商会向该应用程序提供访问令牌,而不是用户的密码。
* 应用程序使用访问令牌来请求受保护的资源,服务提供商验证令牌的有效性并返回相应的数据。
* OAuth常用于API和微服务之间的身份验证和授权。
3. OpenID Connect(OIDC)* OpenID Connect是基于OAuth 2.0的身份验证协议,它建立在OAuth 2.0之上,并扩展了其功能以支持身份验证。
* 当用户尝试访问一个支持OpenID Connect的应用程序时,应用程序会重定向用户到身份提供者。
* 用户在身份提供者上登录后,身份提供者会返回一个包含用户身份信息的ID令牌(ID token),并将其发送回应用程序。
* 应用程序使用ID令牌来验证用户的身份,并允许其访问受保护的资源。
4. Kerberos* Kerberos是一种网络认证协议,它使用加密和密钥交换技术来确保只有经过身份验证的用户才能访问特定的网络资源。
单点登录原理及操作方法
单点登录原理及操作方法
单点登录(Single Sign-On,简称SSO)是一种身份验证的方法,允许用户通过一次登录就可以访问多个关联的应用程序、系统或资源而无需重复输入凭据。
单点登录的原理如下:
1. 用户登录:用户通过输入用户名和密码登录到主SSO系统。
2. 验证身份:主SSO系统验证用户的凭据是否有效。
3. 创建会话:验证通过后,主SSO系统为用户创建一个会话,并生成一个唯一的令牌(Token)。
4. 令牌分发:主SSO系统将令牌发送给用户的浏览器。
5. 应用访问:当用户访问关联的应用程序时,浏览器将令牌作为身份验证凭据发送给应用程序。
6. 验证令牌:应用程序接收到令牌后,将其发送给主SSO系统进行验证。
7. 授权访问:主SSO系统验证令牌后,确认用户的身份,并向应用程序授权用户访问权限。
8. 应用登录:应用程序根据用户的授权信息,允许用户访问相应的资源。
操作方法如下:
1. 在SSO系统中注册用户信息,并将其与关联的应用程序进行绑定。
2. 用户通过SSO系统登录,并获取到令牌。
3. 用户访问关联的应用程序时,将令牌发送给应用程序进行验证和授权。
4. 应用程序根据验证结果和授权信息,决定是否允许用户访问。
5. 用户在SSO系统中登出时,会话和令牌会被销毁,用户需要重新登录。
总结来说,单点登录通过一次登录后获取的令牌进行身份验证和授权,实现了用户在多个应用程序间的无缝访问。
这样能够提高用户体验、简化用户登录过程,并增加应用程序之间的安全性。
java实现单点登录,图例及相关代码
java实现简单的单点登录摘要:单点登录(SSO)的技术被越来越广泛地运用到各个领域的软件系统当中。
本文从业务的角度分析了单点登录的需求和应用领域;从技术本身的角度分析了单点登录技术的内部机制和实现手段,并且给出Web-SSO和桌面SSO的实现、源代码和详细讲解;还从安全和性能的角度对现有的实现技术进行进一步分析,指出相应的风险和需要改进的方面。
本文除了从多个方面和角度给出了对单点登录(SSO)的全面分析,还并且讨论了如何将现有的应用和SSO服务结合起来,能够帮助应用架构师和系统分析人员从本质上认识单点登录,从而更好地设计出符合需要的安全架构。
关键字:SSO, Java, J2EE, JAAS1 什么是单点登陆单点登录(Single Sign On),简称为SSO,是目前比较流行的企业业务整合的解决方案之一。
SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
较大的企业内部,一般都有很多的业务支持系统为其提供相应的管理和IT服务。
例如财务系统为财务人员提供财务的管理、计算和报表服务;人事系统为人事部门提供全公司人员的维护服务;各种业务系统为公司内部不同的业务提供不同的服务等等。
这些系统的目的都是让计算机来进行复杂繁琐的计算工作,来替代人力的手工劳动,提高工作效率和质量。
这些不同的系统往往是在不同的时期建设起来的,运行在不同的平台上;也许是由不同厂商开发,使用了各种不同的技术和标准。
如果举例说国内一著名的IT公司(名字隐去),内部共有60多个业务系统,这些系统包括两个不同版本的SAP的ERP系统,12个不同类型和版本的数据库系统,8个不同类型和版本的操作系统,以及使用了3种不同的防火墙技术,还有数十种互相不能兼容的协议和标准,你相信吗?不要怀疑,这种情况其实非常普遍。
每一个应用系统在运行了数年以后,都会成为不可替换的企业IT 架构的一部分,如下图所示。
随着企业的发展,业务系统的数量在不断的增加,老的系统却不能轻易的替换,这会带来很多的开销。
springboot集成CAS实现单点登录的示例代码
springboot集成CAS实现单点登录的⽰例代码最近新参与的项⽬⽤到了cas单点登录,我还不会,这怎么能容忍!空了学习并搭建了⼀个spring-boot 集成CAS 的demo。
实现了单点登录与登出。
单点登录英⽂全称是:Single Sign On,简称SSO。
含义:在多个相互信任的系统中,只要登录⼀个系统其他系统均可访问。
CAS 是⼀种使⽤⼴泛的单点登录实现,分为客户端CAS Client和服务端 CAS Service,客户端就是我们的系统,服务端是认证中⼼,由CAS提供,我们需要稍作修改,启动起来就可以⽤。
~~~~效果演⽰https证书CAS Service 需要⽤https的⽅式,那么就需要证书,可以买也可以⾃⼰⽣成⼀个。
其实这⼀步也可以省略,访问的时候使⽤http即可,只是cas 会给警告。
步骤和把⼤象装进冰箱⼀样简单,总共三步:⽣成密钥⽣成证书导⼊证书1. ⽣成密钥keytool -genkey -alias cainiao -keyalg RSA -keystore E:sslcainiao.keystore参数说明:-genkey ⽣成密钥-keyalg 指定密钥算法,这时指定RSA-alias 指定别名-keystore 指定密钥库存储位置,这⾥存在 E:/ssl/⽬录下在执⾏中会问你很多问题,当问到:您的名字与姓⽒是什么?此时需要填写域名,作为之后的访问地址,其他随意。
执⾏完后⽣成⼀个密钥⽂件 cainiao.keystore2. ⽣成证书keytool -export -alias cainiao -storepass 123456 -file E:/ssl/cainiao.cer -keystore E:/ssl/cainiao.keystore参数说明:-storepass 刚刚⽣成密钥⽂件时候的设置的密码-file指定导出证书的⽂件名为cainiao.cer-keystore指定之前⽣成的密钥⽂件的⽂件名执⾏完后⽬录下会⽣成⼀个cainiao.cer证书3. 导⼊证书keytool -import -alias cainiao -keystore C:/"Program Files"/Java/jdk1.8.0_181/jre/lib/security/cacerts -file E:/ssl/cainiao.cer -trustcacerts将证书导⼊到JDK信任库把原来的$JAVA_HOME/jre/lib/security/cacerts⽂件要先删掉,否则会报出 Keystore was tampered with, or password was incorrect.下⾯是整个过程:PS E:\ssl> keytool -genkey -alias cainiao -keyalg RSA -keystore E:\ssl\cainiao.keystore输⼊密钥库⼝令:再次输⼊新⼝令:您的名字与姓⽒是什么?[Unknown]: 您的组织单位名称是什么?[Unknown]: cainian您的组织名称是什么?[Unknown]: cainiao您所在的城市或区域名称是什么?[Unknown]: wx您所在的省/市/⾃治区名称是什么?[Unknown]: js该单位的双字母国家/地区代码是什么?[Unknown]: CNCN=, OU=cainian, O=cainiao, L=wx, ST=js, C=CN是否正确?[否]: y输⼊ <cainiao> 的密钥⼝令(如果和密钥库⼝令相同, 按回车):再次输⼊新⼝令:------------------------------------------------------------------------------------PS E:\ssl> keytool -export -alias cainiao -storepass 123456 -file E:/ssl/cainiao.cer -keystore E:/ssl/cainiao.keystore存储在⽂件 <E:/ssl/cainiao.cer> 中的证书------------------------------------------------------------------------------------PS E:\ssl> keytool -import -alias cainiao -keystore C:/"Program Files"/Java/jdk1.8.0_181/jre/lib/security/cacerts -file E:/ssl/cainiao.cer -trustcacerts输⼊密钥库⼝令:所有者: CN=, OU=cainian, O=cainiao, L=wx, ST=js, C=CN发布者: CN=, OU=cainian, O=cainiao, L=wx, ST=js, C=CN序列号: 509d1aea有效期为 Wed Jun 17 22:02:55 CST 2020 ⾄ Tue Sep 15 22:02:55 CST 2020证书指纹:MD5: 5B:B2:7C:D7:B7:31:C5:7C:1C:BC:F7:DA:A8:2D:1C:B2SHA1: F6:76:55:55:D7:48:E3:9F:3A:B6:EE:68:1F:BE:DC:DE:51:B1:33:E5SHA256: 24:53:18:CD:E8:95:65:D8:6E:6A:7B:8E:79:CB:91:BD:F4:2E:C3:99:59:D1:76:12:A8:95:45:2A:4B:03:E4:AD签名算法名称: SHA256withRSA主体公共密钥算法: 2048 位 RSA 密钥版本: 3扩展:#1: ObjectId: 2.5.29.14 Criticality=falseSubjectKeyIdentifier [KeyIdentifier [0000: 70 B3 D5 76 36 EA 54 BA 75 C1 A1 5C DA 76 82 0E p..v6.T.u..\.v..0010: 4D F4 C9 05 M...]]是否信任此证书? [否]: y证书已添加到密钥库中最后,hosts 配置127.0.0.1 搭建CAS service1.> 把pom ⾥⾯的<repositories>仓库地址去掉,国外的仓库地址⽐较慢。
