2013-09-10 52 views
10

目前我有一个Swing应用程序,我不想集成Apache Shiro以验证和委派对某些角色的权限。我已经成功地读取,我已经做检查创建的shiro.ini文件中的用户,它看起来是这样的:Apache Shiro - 使用数据库读取用户,角色和权限

[users] 
admin = 123456, Administrator 

[role] 
Administrator = *:*:* 

然而,这只是为了测试,现在我需要阅读许可证从数据库所以我存储在数据库与信息的表,我需要和它看起来是这样的:

users (id,password,username) 
userRoles (userId, role) 
rolePermission (permissionID,permission,roleID) 

我一直在试图理解,使用JDBC领域的教程,但他们使用网络应用程序或特殊框架来管理它们与数据库的连接,比如Apache Derby或BoneCP,并且他们更多地使用these示例来混淆我。

所以我问的是我需要如何配置shiro.ini文件,如果我想使用JDBC领域(与Oracle数据库)和shiro.ini需要什么类。任何例子或解释将不胜感激!

+0

在我尝试一个答案之前,你知道如何使用JDBC并且你理解关系数据库吗? –

+0

@BalusC不是他们,我说网上的例子,是的,他们非常简单,只要你使用.ini文件来获得用户角色和许可,但是当你想从关系数据库中检索这些信息时,就没有这个问题 – Nivde

+0

@SotiriosDelimanolis I'我不是专家,但对我的理解JDBC是一个应用程序编程接口,允许您从Java语言执行数据库操作 – Nivde

回答

8

Realm接口是可访问应用程序特定的安全 实体,如用户,角色和权限,以确定 认证和授权操作的

安全组件。

您可以实现它来与任何来源进行交互以查找用户及其权限。如果你想与一个基于SQL的数据库进行交互,你可以这样做。如果你想与文本文件交互,你可以这样做。如果您想与Web服务交互,也可以这样做。

Realm有两个有用的(几乎是必须的)扩展名,分别是AuthenticatingRealmAuthorizingRealm。它们分别为认证和授权服务提供接口。 AuthorizingRealm延伸AuthenticatingRealm。您应该扩展AuthorizingRealm以实现您自己的身份验证和授权逻辑。

以一个例子:你有一个数据库表Accounts作为

username | password | role 

Permissions作为

permission_id | permission_name 

和一张桌子Account_Permissions

username | permission_id 

换句话说,一个Account可以有一个角色,但是多个权限。使用JDBC,您可以非常轻松地查询这样的数据库并检索用户名,密码,角色和权限。您的AuthorizingRealm的实现将做到这一点,并构建Shiro的API预期的对象。

在Shiro的认证序列上阅读this document以了解AuthenticatingRealm的来源。

对于INIfile,这取决于你如何实现你的Realm,你就需要将其申报为

myRealm = com.company.security.shiro.YourDatabaseRealm 

可能设置一些属性

myRealm.databaseName = account_database 

四郎提供了自己的JdbcRealm类延伸AuthorizingRealm。这个类对数据库的结构做了一些假设,但是你可以自定义它。

+0

最后,我不得不使用BoneCP为Shiro提供数据源,我期望管理一个连接,而不必使用任何外部库。感谢您耐心解释这个问题非常有帮助,最后我设法实现了Shiro,并理解了这些概念,因为您在这里简要介绍了这些概念。 – Nivde

+0

@ nivde92不客气。请注意,无论您使用的是什么'DataSource',上述都适用。有两个不同的层我们正在谈论。 –

+0

示例表仅反映*基于用户的权限,而不是基于角色的权限。 *基于角色*通常也意味着一个主题可以有多个角色。 –