1

My application is a Eclipse Rich Client and I would like to add authentication and authorization features to. My Users and roles are stored in a database and my application also has a web based admin console which lets me manage users and roles. I am leveraging Spring security on this admin console.

So here's my requirement:

I would like my thick client to provide users with a login dialog box. The authentication would need to be performed on the server side (it could be a webservice) and the roles have to flow in to the thick client. I would also like to manage sessions on the server side, somehow.

I really can't think of any easy way to doing this. I know that if I were to use Spring Rich Client, it would integrate pretty well with Spring Security on the server side. But, that is not an option for me at this point.

Please share your thoughts on how to acheive this. Appreciate your help.

4

4 回答 4

2

由于您倾向于 Web 服务(听起来像您),我会考虑从您的富客户端(我假设用户 ID 和密码)获取用户信息,使用 WS-Security 将加密信息发送到 Web 服务,并让 Web 服务进行身份验证。此外,我会考虑 Web 服务返回您想要返回到富客户端的有关用户的任何信息(名字/姓氏等)。

于 2010-02-24T17:07:33.833 回答
2

我最近使用Challenge-Response-authentication开发了一个类似的应用程序。基本上,您的网络服务或服务器上有三种方法

getChallenge(username) : challenge
getSession(username, response) : key
getData(username, action?) : data

getChallenge 返回一个值(例如一些随机值或时间戳),客户端使用他/她的密码散列并发送回 getSession。例如,服务器将用户名和挑战存储在地图中。

在 getSession 中,服务器计算相同的哈希值并与来自客户端的响应进行比较。如果正确,则生成、存储会话密钥并将其发送到使用用户密码加密的客户端。现在对 getData 的每次调用都可以使用会话密钥加密数据,并且由于客户端已经在 getSession 中验证,他/她不必再次“登录”。

这样做的好处是密码永远不会以纯文本形式发送,如果有人在听,由于密码是用随机值散列的,对 getSession 的调用将很难伪造(例如通过重播调用)。由于来自 getSession 的密钥是使用用户密码加密发送的,因此犯罪者必须知道密码才能破译它。最后,您只需验证用户一次,因为对 getData 的调用将使用用户会话密钥对数据进行加密,然后就不必再“关心”了。

于 2010-03-06T12:32:56.213 回答
1

我认为我有类似的要求。在我们的例子中:

  • 用户在登录时提供用户名和密码
  • 对照 USER 表检查这一点(顺便说一句,密码不是纯文本)
  • 如果有效,我们希望会话持续 20 分钟;我们不想在胖客户端每次执行检索数据或存储数据时检查用户名和密码(我们可以这样做,实际上这不会是世界末日,但它是一个额外的数据库操作这是不必要的)

在我们的例子中,我们有许多特权需要考虑,而不仅仅是一个布尔值“有或没有访问权”。我正在考虑生成一个全局唯一的会话令牌/密钥(例如 java.util.UUID),胖客户端将其保留在某种本地ThinClientSession对象中。

每次胖客户端启动操作时,例如调用getLatestDataFromServer(),此会话密钥都会传递给服务器。

应用服务器(例如运行在 Tomcat 下的 Java webapp)本质上是无状态的,除了这个会话密钥的记录。如果我在上午 10 点登录,那么应用服务器会将会话密钥记录为在上午 10:20 之前有效。如果我在上午 10:05 请求数据,会话密钥有效期将延长到上午 10:25。会话附带的各种特权级别也保持状态。这可以通过一个以 UUID 为键的简单 Map 集合来完成。

至于如何进行这些调用:我推荐 Spring HTTP Invoker。这很棒。您不需要完整的 Spring Rich Client 基础架构,它可以很容易地集成到任何 Java 客户端技术中;例如,我正在使用 Swing 这样做。出于安全目的,这可以与 SSL 结合使用。

无论如何,这大致就是我打算如何解决它。希望这有点用!

于 2010-03-04T11:28:59.123 回答
0

也许这会帮助你:

http://prajapatinilesh.wordpress.com/2009/01/14/manually-set-php-session-timeout-php-session/

特别注意这一点(强制垃圾收集):

ini_set(’session.gc_maxlifetime’,30);
ini_set(’session.gc_probability’,1);
ini_set(’session.gc_divisor’,1);

还有另一个名为 session.cookie_lifetime 的变量,您可能也需要对其进行更改。

IIRC,您必须设置至少 2 个(可能更多)变量。我这辈子都不记得它们是什么了,但我记得有不止 1 个。

于 2010-02-24T16:46:19.703 回答