使用Site.createPortalUser创建门户用户时遇已登录类型异常求助
解决Site.createPortalUser抛出"You are already logged in"异常的办法
这个问题我之前在开发Salesforce门户功能时也碰到过,核心原因很明确:Site.createPortalUser()方法只能在匿名未登录的上下文环境中调用,而你用系统管理员登录后执行代码,就会触发这个类型异常。
下面给你两个可行的解决方向:
1. 切换到匿名上下文执行代码
这是最贴合Site.createPortalUser设计初衷的方式,因为这个方法就是为站点的匿名访问场景设计的(比如用户自主注册门户账号):
- 步骤1:创建带匿名访问权限的Visualforce页面
写一个简单的Visualforce页面,开启allowGuestAccess="true",并在控制器中放入创建门户用户的逻辑。
示例控制器代码:
对应的Visualforce页面:public class PortalUserRegistrationController { public PageReference createPortalUser() { // 构造要创建的用户对象,替换为你的实际字段值 User newPortalUser = new User( FirstName = 'Chandu', LastName = 'Vijay', Email = 'chandu@example.com', Username = 'chandu@example.com', ProfileId = '00eXXXXXXXXX' // 替换为你的门户用户Profile ID ); // 获取要关联的Account(这里假设你已经有目标Account) Account targetAccount = [SELECT Id FROM Account WHERE Name = 'Your Account' LIMIT 1]; // 调用Site.createPortalUser Id createdUserId = Site.createPortalUser(newPortalUser, targetAccount.Id, 'Sep@2012', true); return null; } }<apex:page controller="PortalUserRegistrationController" action="{!createPortalUser}" allowGuestAccess="true"> 门户用户创建成功! </apex:page> - 步骤2:匿名访问页面
不要登录Salesforce,直接用你的站点域名访问这个页面(比如https://your-site-domain.force.com/PortalUserRegistration),此时处于匿名状态,就能成功执行Site.createPortalUser方法。
2. 后台逻辑中创建门户用户(替代方案)
如果你的需求是在后台登录状态下创建门户用户(比如管理员批量创建),不要用Site.createPortalUser,改用User.createUser()方法,手动处理门户用户的配置:
// 构造门户用户 User newPortalUser = new User( FirstName = 'Chandu', LastName = 'Vijay', Email = 'chandu@example.com', Username = 'chandu@example.com', ProfileId = '00eXXXXXXXXX', // 门户Profile ID ContactId = [SELECT Id FROM Contact WHERE AccountId = :targetAccount.Id LIMIT 1].Id, // 关联到Account下的Contact IsActive = true ); // 创建用户 Database.SaveResult result = User.createUser(newPortalUser, 'Sep@2012'); if (result.isSuccess()) { // 处理成功逻辑 } else { // 处理错误 }
这种方式需要确保执行代码的用户有创建用户的权限,并且手动关联Contact和Account,同时可以自己控制是否发送激活邮件。
另外还要注意:
- 确保你的Salesforce站点已经正确配置,关联了对应的门户Profile;
- 如果用第一种方式,要确保站点的匿名访问权限允许执行对应的Apex代码。
内容的提问来源于stack exchange,提问作者Chandu Vijay
相关产品推荐
相关产品推荐

