java单点登录的实现
java单点登录的实现
在门户项目中,经常会遇到如何实现单点登录的问题,下面就本人的经验做个总结。欢迎大家进行补充讨论。单点登录的具体实现有很多种选择,包括:
1.采用专门的SSO商业软件:主要有:Netgrity的Siteminder,已经被CA收购。Novell 公
司的iChain。RSA公司的ClearTrust等。
2.采用门户产品供应商自己的SSO产品,如:BEA的WLES,IBM 的Tivoli Access Manager,
Sun 公司的identity Server,Oracle公司的OID等。
3.这些商业软件一般适用于客户对SSO的需求很高,并且企业内部采用COTS软件如:
Domino,SAP,Sieble的系统比较多的情况下采用。并结合身份管理。统一认证等项目采用。
采用这些软件一般都要对要集成的系统做些改造,如在要集成的系统上安装AGENT。
现在一般只提供常见软件如:Domino,SAP,Sieble,常见应用服务器:weblogic,websphere
等的AGENT。要先统一这些系统的认证。一般采用LDAP或数据库。然后才能实现SSO。
比较麻烦。
4.另外,如果不想掏银子,也有OPEN SOURCE的SSO软件可选:主要有:
https://www.360docs.net/doc/5d7437797.html,/ https://https://www.360docs.net/doc/5d7437797.html,/ https://www.360docs.net/doc/5d7437797.html, 等。具体怎么样
就不清楚了。
如果项目对SSO的要求比较低,又不想对要被集成的系统做任何改动,可采用下面介绍的方式简单实现:下面我们通过一个例子来说明。假如一个门户项目要对下面的几个系统做SSO。
用户在这些系统中的用户名,密码各不相同,如:员工号为001的员工在这些系统中的用户名,密码分别如下:
用户系统用户名密码
001Portal系统A1234
001邮件系统B2345
001DOMINO系统C AAAA
001报销系统D CCCC
001工资系统E BBBB
首先,建立员工在PORTAL系统中的用户名和其他系统中的用户名之间的对应关系
首先,要建立员工在PORTAL系统中的用户名和其他系统中的用户名之间的对应关系并保存。可保存在表中或LDAP中或文件系统中。当然要考虑这些系统之间的数据同步问题。比较好的方式是找到用户在这些系统中的都存在的唯一信息(如员工号,MAIL地址,姓名等)。通过唯一信息实时到各个系统中去取认证所需要的信息。就不需要考虑数据同步问题。比较实用。可以建立类似下面的表:密码可采用加密保存。如果是采用BEA的Weblogic Portal,可采用UUP来保存这些信息。
(
user
varchar2(20),
app_name varchar2(20),
architect varchar2(4),
app_company varchar2(50),
app_department varchar2(50),
app_user varchar2(15),
app_passwd varchar2(15),
app_cookie varchar2(30),
form_user varchar2(20),
form_passwd varchar2(20),
app_special varchar2(20)
);
通过IFRAME或超连接方式集成目标系统,并进行SSO
通过IFRAME或超连接方式集成目标系统,并在URL中带上用户名和密码。如集成DOMINO可采用如下方式:
width=" >
或:
Href src=“http:// host1/names.nsf?Login&Username=admin&Password=pass&RedirectTo=/names.nsf”
以上采用的是在HTTP中直接传递明码,为提高安全性,可采用HTTPS来传递用户名和密码。另外采用这种方式被集成的系统必须支持FORM方式认证。J2EE应用,DOMINO等都支持FORM 认证。
这两种方式如果SSO成功,就自动进入目标系统的界面,如果实现会显示目标系统的登录界面。其效果图如下:
这种方式,必须维护对应关系表,如上面的sso_info。更好的方式是提供界面,让最终用户自己维护这种对应关系,可模仿Compoze portlets for lotus的做法,在用户第一次进入要与之做SSO的系统时,如DOMINO系统,显示一个界面,让用户自己输入他在该系统中的用户名/密码等信息。并保存到表中或LDAP等其他数据源中。以后用户要进入这些系统时,就直接从表中或其他数据源中取用户的用户名/密码等信息,帮助用户做认证。建议采用这种方式。如下图所示。如果用户改变了自己在DOMINO系统中的用户名,密码。从门户系统进入DOMINO系统时,认证会失败,就重新显示类似下面的界面。让用户重新输入他在DOMINO系统中新的用户名,密码并保存。
以上这种实现方式,一般需要浏览器支持COOKIE,所以要注意浏览器的配置,在开发阶段,为方便调试,可设置IE,让它显示COOKIE的名称。如下所示:
采用这种方式,对要集成的系统不需要做任何的改动。如果PORTAL系统中的用户在被集成的系统中的权限都一样,可采用建立一个通用用户的做法。也就是所有在PORTAL系统中的用户都采用这个通用用户进入目标系统。这种方式等于是采用页面集成方式做集成。比较方便使用。另外,有时候需要采用调用API,或配置Adapter等应用集成方式来集成其他系统,一般也是通过定义一个连接专用的用户。在API中或在配置Adapter的时候写死。如采用JA V A API方式集成DOMINO:lotus.domino.Session dominoSession = NotesFactory.createSession(dominoServer, “admin”, “password”);
CS结构实现方式
经常有人问CS结构的应用如何实现SSO,本人的建议是对这种系统不要自己去实现SSO。很麻烦,其实输个用户名,密码没什么大不了的。如果要实现,一是采用商业软件。另外也可以采用以下方式:在PORTAL的PORTLET上建立超连接。并通过APPLET方式启动CS结构的应用系统的登录界面。然后通过如下的方式把用户名/密码传递过去。
-不能做任何改动的客户端- WIN消息(给登录窗口发送用户名,密码等登录所需要的信息),模拟键盘(java有模拟键盘输入的API)
-可以做改动的客户端- 参数传递,并让登录的EXE文件读取参数进行认证。
因为要让APPLET执行本地的EXE文件,所以必须对IE中的JRE的安全进行设置。
其他:
在采用以上方式实现了SSO后,要注意LOGOUT,可采用与LOGIN相同的方式。也可以通过被集成系统的超时设置来实现。
单点登录SSO技术资料收集
?统一用户认证和单点登录解决方案: 计算机世界网上的文章,比较全面的介绍统一用户认证和单点登录解决方案
?惠普灵动单点登录(SSO)解决方案: 包括C/S结构的系统单点登录解决方案
?网站用户单点登录系统解决方案: 通过令牌方式实现网站用户单点登录
?WebLogic平台的Web SSO(SAML)解决方案: 在WebLogic 8.1SP4中,提供了用于和Microsoft Windows客户端进行SSO的Single Pass Negotiate Identity Assertion Provider。
本文对其做了详细的介绍。
?https://www.360docs.net/doc/5d7437797.html,/index.php?blogId=4: 收录了一些SSO方面的文章
?应用整合中SSO的技术实现: 作者介绍了南京地税进行应用整合SSO的技术实现方案
JAVA语言登陆界面设计
登陆界面设计 程序: import javax.swing.*; import java.awt.*; public class登陆界面设计extends JFrame{ public登陆界面设计(){ //构造方法名称要与类名称一致this.setTitle("学生系统登陆界面"); this.setForeground(Color.blue); this.setBounds(200, 200, 400, 400); this.setDefaultCloseOperation(EXIT_ON_CLOSE); JLabel labname=new JLabel("登陆名:"); JLabel labpassed=new JLabel("登陆密码:"); JTextField tex1=new JTextField(""); JTextField tex2=new JTextField(""); JButton bun1=new JButton("登陆"); JButton bun2=new JButton("退出"); JPanel panel =(JPanel) this.getContentPane(); panel.setLayout(null); panel.setBackground(Color.green); panel.add(labname); labname.setBounds(100, 60, 100, 30); // labname.setForeground(Color.red); labname.setFont(new Font(null,Font.ITALIC,20)); panel.add(tex1); tex1.setBounds(200, 60, 100, 30); // tex1.setForeground(Color.red); tex1.setFont(new Font(null,Font.ITALIC,20)); panel.add(labpassed); labpassed.setBounds(100, 120, 100, 30); // labpassed.setForeground(Color.red); labpassed.setFont(new Font(null,Font.ITALIC,20)); panel.add(tex2); tex2.setBounds(200, 120, 100, 30); // tex2.setForeground(Color.red); tex2.setFont(new Font(null,Font.ITALIC,20)); panel.add(bun1); bun1.setBounds(100, 180, 100, 50); bun1.setForeground(Color.red); bun1.setFont(new Font(null,Font.ITALIC,20)); panel.add(bun2);
java 学生信息管理登陆界面
package登陆界面; import java.awt.*; import java.awt.event.*; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import javax.swing.*; import主窗体.MainFrame; import https://www.360docs.net/doc/5d7437797.html,monaJdbc; public class Landing_interface extends JFrame implements ActionListener{ public static String str; JFrame jf=new JFrame("登录系统"); JPanel p1=new JPanel(); JPanel p2=new JPanel(); JPanel p3=new JPanel(); JPanel p4=new JPanel(); JPanel p5=new JPanel(); JPanel p6=new JPanel(); JPanel p7=new JPanel(); String username; static String passwd; JLabel name=new JLabel("用户名:"); static JTextField nametext=new JTextField(10); JLabel pwd=new JLabel("密码:"); JPasswordField password=new JPasswordField(10); JButton login=new JButton(""); public Landing_interface(){
QQ登录界面java代码(优选.)
最新文件---------------- 仅供参考--------------------已改成-----------word文本 --------------------- 方便更改 赠人玫瑰,手留余香。 package denglu; import java.awt.*; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.*; public class Dl extends JFrame{ private static final long serialVersionUID = 1L; Font f1=new Font("宋体", Font.PLAIN, 14); JLabel lb1,lb2,lb3,lb4; JButton b1,b2,b3; JComboBox cb; JTextField tf; JTextField pw; public void CreateJFrame(String title) { JFrame jf = new JFrame(title); Container container = jf.getContentPane(); lb1=new JLabel(new ImageIcon("image/tou.gif")); lb2=new JLabel(new ImageIcon("image/qqtou.gif"));
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } public static void main(String args[]) { // 在主方法中调用createJFrame()方法 new Dl().CreateJFrame("QQ登陆界面"); } } jp=new JPanel(); jp.setLayout(null); jp_jlb1=new JLabel(new ImageIcon("image/qqtou.gif")); jp_jlb1.setBounds(18, 10, 85, 85); //设置标签位置前提是要空布局 jp_jtf=new JTextField("QQ号码/手机/邮箱"); jp_jtf.setForeground(Color.LIGHT_GRAY);//设置颜色 jp_jtf.addMouseListener(this); jp_jtf.setBounds(118, 11, 170, 25); jp_pw=new TextField("密码",24); jp_pw.setForeground(Color.LIGHT_GRAY); jp_pw.addMouseListener(this); jp_pw.setBounds(118, 45, 170, 24);
基于java的图书管理系统登录界面
package library; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Font; import java.awt.GridBagLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import https://www.360docs.net/doc/5d7437797.html,.PasswordAuthentication; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import javax.swing.AbstractButton; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JRadioButton; import javax.swing.JTextField; public class login extends JFrame implements ActionListener { private JTextField namefield; private JTextField numfield; private JButton button; private String number; private AbstractButton button1; private JComboBox box; public login() { init(); } private void init() { setDefaultCloseOperation(EXIT_ON_CLOSE); setBounds(200, 200, 450, 400); setResizable(false); setLayout(null); setTitle("登录界面");
java登录窗口代码
import java.awt.BorderLayout; import java.awt.Color; import java.awt.FlowLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JTextField; public class text extends JFrame { /** * @param args */ public String str="左自强"; public String strc="1234567"; protected JButton a=new JButton("注册"); protected JButton b=new JButton("登录"); protected JPanel bb=new JPanel(); protected JLabel aa=new JLabel(" 如果你是新用户请先注册帐号"); text() { setLayout(new GridLayout(3,1)); bb.setLayout(new FlowLayout()); bb.add(a); bb.add(b); add(aa); add(bb); b.addActionListener(new ActionListener()//创建事件监听器 { @Override public void actionPerformed(ActionEvent arg0) { // TODO Auto-generated method stub System.out.print("zuoziqiang"); loade jf=new loade(); jf.pack();
Java--登陆注册系统(模仿qq登陆界面)
Java--登陆注册系统(数据库) import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.sql.*; public class DengLu extends JFrame implements ActionListener,KeyListener,ItemListener,FocusListener{ JLabel top,bott; JComboBox combobox; JPasswordField password; JButton b_login,b_regedit; JPanel panelMain,panel_center; public DengLu (){ super("登陆系统"); panelMain = new JPanel(new BorderLayout(10, 10)){ public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D)g; super.paintComponent(g); Image img = Toolkit.getDefaultToolkit().getImage("G:\\image\\Denglubg.jpg"); g2.drawImage(img, 0, 0, this.getWidth(), this.getHeight(), this); } }; top = new JLabel (); top.setPreferredSize(new Dimension(this.getWidth(),30)); bott = new JLabel (); bott.setForeground(Color.white); bott.setPreferredSize(new Dimension(this.getWidth(),25)); centerBuild(); additem(); panelMain.add(top,BorderLayout.NORTH); panelMain.add(bott,BorderLayout.SOUTH); panelMain.add(panel_center,BorderLayout.CENTER); combobox.addItemListener(this);
javaWeb项目实现简单的登录注册
JavaWeb项目实现登录注册 一. 电脑,eclipse,tomcat,mysql数据库 数据库连接架包 二.项目开始 1.打开eclipse创建一个新的JavaWeb项目,将下载的数据库连接架包放到WebContent 目录下的WEB-INFO中的lib下,右键加入构建路劲。 2.在WebContent下新建一个login.jsp的登录页面 代码如下: <%@page language="java"contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% String path = request.getContextPath();//获取项目名String basePath = request.getScheme() + "://" + request.getServerName() + ":"+ request.getServerPort() + path + "/"; //项目的绝对路径
%>