关于Cognos第三方用户认证(CustomJavaProvider)的demo网上的例子很多,当然最权威的你可以从Cognos安装的SDK中去探索,本文不详细的说明代码,主要说一下认证的处理过程,以及处理过程中遇到的问题;
Step1:创建Cognos用户安全库
表的创建脚本:
CREATE TABLE [dbo].[PT_User_Role](
[ID] [int] IDENTITY(1,1) NOT NULL,
[UserID] [int] NULL,
[RoleID] [int] NULL,
CONSTRAINT [PK_User_Role] PRIMARY KEY CLUSTERED
(
[ID] ASC
)
) ON [PRIMARY]
CREATE TABLE [dbo].[PT_User](
[UserID] [int] IDENTITY(1,1) NOT NULL,
[DepID] [int] NULL,
[CardNo] [varchar](10) NULL,
[UserName] [varchar](20) NULL,
[Password] [varchar](50) NULL,
[ChineseName] [varchar](50) NULL,
[Sex] [int] NULL,
[Address] [varchar](200) NULL,
[Phone] [varchar](20) NULL,
[EMail] [varchar](50) NULL,
[Duty] [varchar](50) NULL,
[LoginFlag] [int] NULL,
[LastLogTime] [datetime] NULL,
[Status] [int] NULL,
[FullPath] [varchar](500) NULL,
[BindStatus] [int] NULL,
CONSTRAINT [PK_User] PRIMARY KEY CLUSTERED
(
[UserID] ASC
)
) ON [PRIMARY]
CREATE TABLE [dbo].[PT_Role](
[RoleID] [int] IDENTITY(1,1) NOT NULL,
[RoleName] [varchar](50) NULL,
[Description] [varchar](500) NULL,
[RoleType] [int] NULL,
CONSTRAINT [PK_Role] PRIMARY KEY CLUSTERED
(
[RoleID] ASC
)
) ON [PRIMARY]
CREATE VIEW [dbo].[pt_user_view]
AS
SELECT RoleID AS 'uid', RoleName AS 'name', RoleName AS 'givenname', 0 AS issqluser, 1 AS issqlrole
FROM dbo.PT_Role
UNION ALL
SELECT UserID AS 'uid', UserName AS 'name', ChineseName AS 'givenname', 1 AS issqluser, 0 AS issqlrole
FROM dbo.PT_User
Step2:创建第三方认证project
Project目录如图所示
导出为
EnFoProvider.jar
Step3:将各种需要文件放入指定目录
准备工作已经做好,我们可以看cognos的SDK关于第三方java认证的提醒如下:
/**
* Licensed Materials - Property of IBM
*
* IBM Cognos Products: CAMAAA
*
* (C) Copyright IBM Corp. 2005, 2011
*
* US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with
* IBM Corp.
*/Running the IBM Cognos SDK custom authentication JDBC provider sample
--------------------------------------------------------------------To configure and run the sample provided, please follow these steps:
1) Add the Java SDK to your path.
2) Build the sample using the command build.bat on Windows or
build.sh on Unix.
3) Add the jar file to your IBM Cognos 10 classpath or copy the jar to
<install>/webapps/p2pd/WEB-INF/lib.
4) Add the MS SQL server jarfiles (sqljdbc.jar or sqljdbc4.jar) to your classpath or copy the files to
<install>/webapps/p2pd/WEB-INF/lib.
Refer to http://technet.microsoft.com/en-us/library/ms378422.aspx for the system requirements.
5) Copy the JDBC configuration file to the <install>/configuration
directory. Ensure that the name contains the namespaceID to be
recognized (namespaceID is case sensitive).
Ex:
namespaceID = Sample1
JDBC configurations file = JDBC_Config_Sample1.properties
6) Modify the content of the configuration file to point to your
MSSQL database.
7) In IBM Cognos Configuration, configure the Custom Java namespace
using the configuration tool, (the class name and NamespaceID
are case sensitive):
Type: Custom Java provider
Namespace ID: Sample1
Java class name: JDBCSample
8) Apply changes and restart IBM Cognos 10.The new authentication namespace should now appear in IBM Cognos 10 for
logon and security administration tasks within IBM Cognos 10.NOTE: Should IBM Cognos 10 fail to start up once the new namespace
is configured, please verify your configuration. IBM Cognos 10 will
not start up if it cannot successfully communicate to the
authentication source.
--按照上面的步骤操作
注意的地方是:集成的jar文件放在/webapps/p2pd/WEB-INF/lib 目录,JDBC_Config_EnFoProvider.properties数据库配置文件放在<install>/configuration目录,
然后/webapps/p2pd/WEB-INF/lib也要有数据库驱动文件,比如sqljdbc.jar,class12.jar等等;
Step4:在Cognos Configuration中配置命名空间;
4.1:进入安全→身份验证右键点击新建资源-名称空间,如图确定
确定以后,如下配置
空间标示符需要和JDBC_Config_EnFoProvider.properties中文件的末尾一样,java类名就是指我们自己的project中认证的入口类的完整路径,OK,保存测试:
注意,此处我们会遇到一个最常见的问题就是无法加载类,问题分析:
第一:可能是jdk版本问题,最好不要太低(cognos10最好是jdk1.6以上)
第二:可能是当前cognos配置没有加载,关掉Cognos Configuration界面然后重新test 如下图
则说明jar文件已经被加载成功。
4.2:关闭cognos匿名访问
启动cognos报表服务:访问cognos connection
这里的admin 来自sqlserver库中表[dbo].[PT_User]中
我们换个用户登录,
从上面我们可以看出来,我们自己库中的用户可以登录了,而且登录以后都可以管理cognos的内容,这说明了我们现在的所有用户都是管理员,是什么原因呢,OK进入看一下我们的名称空间,如下图:
从上面可以看出在cognos的默认空间中,系统管理员的角色中包含任何人这个用户组,所以我们就需要把这个任何人从Cognos这个名称空间中删除,切记:删除之前,把我们自己的管理组角色添加来,如果不添加进来,那么就没有管理员角色了,唯一的办法只有去执行管理员初始化脚本,先回复所有人管理员的权限,然后执行上面的操作;
OK,在cognos名称空间中添加了我们自己名称空间中数据管理员的角色,然后再删除了任何人以后;
我们再次用wxj普通用户和属于数据管理员的用户admin登录,可以看到普通用户不在具有管理cognos内容的功能了,admin就可以
OK,截止目前一个简单的第三方认证登录已经完成了;
需要注意的是:我们只是把我们自己创建的名称空间中的角色加入了Cognos自带的角色中,而这个操作需要管理员的权限来完成,我们一开始要保留所有用户/匿名用户的系统管理员权限(这里也可以说是在cognos的名称空间中系统管理员角色中包含‘任何人’这个成员),这个是cognos初始默认的情况;然后我们用我们自己名称空间中的用户登录,此时所有用户都具有管理员的权限,然后执行:添加自定义管理员到cognos的管理员中,从cognos的管理员中去掉‘任何人’OK,结果是:在我们的操作中,我们自己名称空间中的管理员组拥有了cognos管理员的权限,不是管理员的组的用户的权限也可以用我们具有管理员权限的用户来操作了;
此文:感谢的支持;
问题补充:如果一切OK以后,并且访问了cognos connection以后,名称空间的camid就会被保存在Content Manager的内容库中,如果再次修改资料空间的名称就要报错了,因为相同ID的名称空间已经存在
解决办法:删掉内容库,重新配置,一切OK;