我相信你现在已经想通了,但我也有同样的问题。
如果您希望将角色附加到用户对象,则必须将角色显式添加到您的令牌(Auth 和 id)中。
您可以通过多种方式做到这一点,但我通过在 Auth0 中添加规则来做到这一点:
function setRolesToUser(user, context, callback) {
const namespace = 'http://my-website-name.com';
const assignedRoles = (context.authorization || {}).roles;
let idTokenClaims = context.idToken || {};
let accessTokenClaims = context.accessToken || {};
idTokenClaims[`${namespace}/roles`] = assignedRoles;
accessTokenClaims[`${namespace}/roles`] = assignedRoles;
context.idToken = idTokenClaims;
context.accessToken = accessTokenClaims;
callback(null, user, context);
}
现在,您的令牌将作为命名空间数组附加规则,并在所述数组中分配角色。
现在您的令牌已附加角色,您可以使用它来控制 Nextjs 上的内容,如下所示:
import { getSession } from '@auth0/nextjs-auth0';
export async function getServerSideProps({ req, res }) {
const session = getSession(req, res);
if (!session?.user['http://my-website-name/roles'].includes('admin')) {
return { props: { error: 'Forbidden' } };
} else {
return {
props: {},
};
}
}
然后在你的组件中,你可以像这样提前返回:
if (error) return <div>{error}</div>;
这解释了服务器端,但您可以使用 useUser 做类似的客户端:
import { useUser} from '@auth0/nextjs-auth0';