chx 学习jForum笔记十一 实现单点登录SSO

分为三部分:

1.导入原用户数据库.

2.修改SSO模块,实现登录认证.

3.实现新增用户.

 

从原表导入,使用以下SQL语句.可直接导入,也可加入\web-inf\config\database\sqlserver2000\sqlserver_2000_data_dump.sql

SET IDENTITY_INSERT jforum_users ON;
insert into jforum_users(user_id,username) select id+1000,emp_name from rswkbase;
update jforum_users set user_password = 'nopass',user_regdate = '2010-12-1' where user_password = ''
SET IDENTITY_INSERT jforum_users OFF;

初始库的导入是为了将原有的论坛内容转移至新论坛。

 

以下实现SSO功能。

 

修改SystemGlobals.properties

authentication.type = sso
sso.implementation = net.jforum.sso.RemoteUserSSO

由于原TOMCAT设置的request.getRemoteUser()中得到的是四位用户代码而不是用户名名,所以此处需要进行修改。

SSO模块修改.在net.jforum/sso/RemoteUserSSO.java中

else if (remoteUser != null && !remoteUser.equals(userSession.getUsername())) {

 改为

else if (remoteUser != null && !remoteUser.equals(String.valueOf(userSession.getUserId()))) {

 

在ControllerUtils.java中的checkSSO中新增

				if (!utils.userExists(username)) {
					final SessionContext session = JForumExecutionContext.getRequest().getSessionContext();

					String email = (String) session.getAttribute(SystemGlobals.getValue(ConfigKeys.SSO_EMAIL_ATTRIBUTE));
					String password = (String) session.getAttribute(SystemGlobals.getValue(ConfigKeys.SSO_PASSWORD_ATTRIBUTE));

					if (email == null) {
						email = SystemGlobals.getValue(ConfigKeys.SSO_DEFAULT_EMAIL);
					}

					if (password == null) {
						password = SystemGlobals.getValue(ConfigKeys.SSO_DEFAULT_PASSWORD);
					}

					utils.register(password, email);
				}
				

 改为

                boolean _flag = false;
                Integer userId=-1;
                try {
                    userId = Integer.parseInt(username);
                    _flag = utils.userExists(userId);
                } catch (Exception e){
                    _flag = utils.userExists(username);
                }
                if (!_flag) {
                    utils.register(userId);
                }
 

 

 

在SSOUtils.java中新增

    public boolean userExists(final Integer userId) //查询用户是否已注册
    {
        this.dao = DataAccessDriver.getInstance().newUserDAO();
        this.user = this.dao.selectByUserId(userId);
        this.exists = this.user != null;
        if (this.exists){
          this.username = this.user.getUsername();
        }
        return this.exists;
    }

在GenericUserDAO.java中新增

    public User selectByUserId(int userId)
    {
        PreparedStatement p = null;
        ResultSet rs = null;
        try {
            p = JForumExecutionContext.getConnection().prepareStatement(SystemGlobals.getSql("UserModel.selectByUserId"));
            p.setInt(1, userId);

            rs = p.executeQuery();
            User user = null;

            if (rs.next()) {
                user = new User();
                this.fillUserFromResultSet(user, rs);
            }

            return user;
        }
        catch (SQLException e) {
            throw new DatabaseException(e);
        }
        finally {
            DbUtils.close(rs, p);
        }
    }

 在UserDAO.java中新增

    User selectByUserId(int userId) ;
 

 

以下实现用户新增功能

在SSOUtils.java中新增

    public void register(final Integer userId) //新用户注册
    {
            // Is a new user for us. Register him
            this.user = new User();
            this.user.setId(userId);
            this.user.setUsername(getname(userId));
            this.user.setPassword(userId.toString());
            this.user.setEmail(getemail(userId));
            this.user.setActive(1);
            this.dao.addNewWithId(this.user);
            // Update the information
            ForumRepository.setLastRegisteredUser(this.user);  //设置最终注册用户
            ForumRepository.incrementTotalUsers(); //注册总人数加一
    }

 

   private String getname(final Integer userId){//从原数据表中获取用户名
        ResultSet resultSet = null;
        PreparedStatement pstmt = null;
        this.username = "null";
        try
        {
            pstmt = JForumExecutionContext.getConnection().prepareStatement(
                    SystemGlobals.getSql("UserState.getUsername"));
            pstmt.setInt(1, userId);

            resultSet = pstmt.executeQuery();
            if (resultSet.next()) {
                this.username = (resultSet.getString("emp_name"));
            }
        }
        catch (SQLException e)
        {
            throw new ForumException(e);
        }
        finally
        {
            DbUtils.close(resultSet, pstmt);
        }
     return this.username;
    }

 

   private String getemail(final Integer userId){//从原数据表中获取电子邮箱
        ResultSet resultSet = null;
        PreparedStatement pstmt = null;
        this.email = "null";
        try
        {
            pstmt = JForumExecutionContext.getConnection().prepareStatement(
                    SystemGlobals.getSql("UserState.getEmail"));
            pstmt.setInt(1, userId);

            resultSet = pstmt.executeQuery();
            if (resultSet.next()) {
                this.email = (resultSet.getString("mail"));
            }
        }
        catch (SQLException e)
        {
            throw new ForumException(e);
        }
        finally
        {
            DbUtils.close(resultSet, pstmt);
        }
        return this.email;
    }
 

在generic_queries.sql 中增加

UserModel.selectByUserId = SELECT * FROM jforum_users WHERE user_id = ?
UserState.getUsername = SELECT emp_name FROM rswkbase WHERE id = ?
UserState.getEmail = SELECT mail FROM chx_base_userstate WHERE user_id = ?

 这两句是从原有的数据表中取相应的内容。

 

 

 

ant dist

 

### 回答1: C语言中并不支持多态,多态是面向对象编程的一个重要概念,可以在C++、Java、Python等面向对象语言中实现。 在面向对象语言中,多态是通过虚函数(virtual function)实现的。虚函数是在父类中定义,但可以在不同的子类中被重写,从而使得不同的子类表现出不同的行为。在程序运行时,通过动态绑定(dynamic binding)机制,程序能够确定应该调用哪个子类中的虚函数。这就实现了多态。 ### 回答2: 在 C 语言中,多态性(Polymorphism)的实现主要依赖于函数指针和结构体的相关特性。具体的实现过程如下: 1. 首先,我们需要定义一个基类(Base Class)。基类是一个结构体,包含了类的属性和方法的定义。 2. 然后,我们定义不同的子类(Derived Class),这些子类继承基类,并且可以重写基类的方法。 3. 接下来,我们为每个子类定义一个函数指针(Function Pointer),该指针指向子类的方法。 4. 在使用多态性时,我们可以通过基类的指针来调用相应的方法。这里涉及到了函数指针的动态绑定特性。当我们调用基类的方法时,实际上执行的是函数指针所指向的子类方法。 5. 在运行时,根据实际指向的子类,会自动选择正确的方法。这就是多态性的实现过程。 总结起来,C 语言中的多态性是通过函数指针和结构体的组合来实现的。利用函数指针的动态绑定特性,通过基类指针来调用和执行不同的子类方法,从而实现不同类型的对象之间的相同操作。这样的实现方式可以在一定程度上提高代码的灵活性和可复用性。 ### 回答3: C语言并不直接支持多态,因为多态是面向对象编程的概念,而C是一种面向过程的编程语言。但是,我们可以通过一些技巧来实现类似多态的效果。 一种常见的实现方式是利用函数指针和结构体。我们可以定义一个通用的接口结构体,其中包含一个函数指针成员,用于指向不同类型的函数实现。然后,针对不同的类型,我们定义不同的结构体,每个结构体中包含相应的函数实现。最后,通过函数指针的动态绑定,调用合适的函数实现。这样,我们就可以实现在不同类型之间进行函数调用的多态效果。 另一种方式是使用函数指针数组。我们可以定义一个包含不同类型函数指针的数组,每个函数指针对应一个特定的函数实现。然后,通过数组的索引来调用相应的函数实现。这样,我们可以在运行时动态选择合适的函数实现,从而达到多态的效果。 以上两种方式都是通过函数指针的灵活运用来实现C中类似多态的效果。虽然它们不能像其他面向对象编程语言那样直接支持多态特性,但通过巧妙的设计和编程技巧,我们可以在C中达到类似的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值