我的应用程序是Eclipse Rich Client,我想添加身份验证和授权功能。我的用户和角色存储在数据库中,我的应用程序还有一个基于Web的管理控制台,可以让我管理用户和角色。我在这个管理控制台上利用Spring安全性。
所以这是我的要求:
我希望我的胖客户端为用户提供登录对话框。需要在服务器端执行身份验证(可能是Web服务),并且角色必须流入胖客户端。我还想以某种方式管理服务器端的会话。
我真的想不出任何简单的方法来做到这一点。我知道如果我使用Spring Rich Client,它将与服务器端的Spring Security很好地集成。 但是,在这一点上,这不是我的选择。
请分享您对如何实现这一点的想法。感谢您的帮助。
答案 0 :(得分:2)
由于您倾向于使用Web服务(听起来像你),我会考虑从您的富客户端获取用户信息(我假设用户ID和密码),使用WS-Security将加密信息发送到一个Web服务,让Web服务执行auth的东西。此外,我会考虑Web服务返回您想要返回富客户端的有关用户的任何信息(名/姓等)。
答案 1 :(得分:2)
我最近使用Challenge-Response-authentication开发了一个类似的应用程序。基本上,您的Web服务或服务器上有三种方法
getChallenge(username) : challenge
getSession(username, response) : key
getData(username, action?) : data
getChallenge返回客户端使用他/她的密码进行哈希值并将其发送回getSession的值(例如某些随机值或时间戳)。例如,服务器将用户名和质询存储在地图中。
在getSession中,服务器计算相同的哈希值并与客户端的响应进行比较。如果正确,则生成,存储会话密钥,并将其发送到使用用户密码加密的客户端。现在每次调用getData都可以使用会话密钥加密数据,并且由于客户端已在getSession中验证,因此他/她不必再次“登录”。
关于这一点的好处是密码永远不会以纯文本形式发送,如果有人正在收听,由于密码是使用随机值进行哈希处理,因此对getSession的调用将很难伪造(通过重播调用实例)。由于来自getSession的密钥是使用用户密码加密发送的,因此犯罪者必须知道密码才能解密它。最后,您只需要验证一次用户,因为对getData的调用会使用用户会话密钥对数据进行加密,然后不再需要“关注”。
答案 2 :(得分:1)
我认为我有类似的要求。在我们的案例中:
在我们的例子中,我们有许多权限要考虑,而不仅仅是布尔“有或没有访问权限”。我正在考虑做的是生成一个全局唯一的会话令牌/密钥(例如java.util.UUID),胖客户端保留在某种本地 ThickClientSession 对象中。
每次胖客户端启动操作时,例如调用 getLatestDataFromServer(),此会话密钥将传递给服务器。
除了此会话密钥的记录之外,app服务器(例如在Tomcat下运行的Java webapp)基本上是无状态的。如果我在上午10点登录,则应用服务器会将会话密钥记录为有效,直到上午10:20。如果我在上午10:05请求数据,会话密钥有效期延长到上午10:25。会议期间的各种特权级别也在州内。这可以通过在UUID上键入的简单Map集合来完成。
关于如何进行这些调用:我推荐Spring HTTP Invoker。这很棒。您不需要一个完整的Spring Rich Client基础架构,它可以很容易地集成到任何Java客户端技术中;我正在使用Swing这样做。出于安全考虑,这可以与SSL结合使用。
无论如何,这大致是我计划解决的问题。希望这有一些用处!
答案 3 :(得分: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个。