RemixJS端点认证疑问:函数暴露与认证处理位置
RemixJS认证实现疑问解答
你当前的路由代码:
export function loader({request}){ await checkAuthentication(request) } export function action({request}){ await checkAuthentication(request) await doAuthProtectedJob({}) } // UI implementation is irrelevant
服务端工具代码:
export async function checkAuthentication(request){ const isAuth = await checkAuth(request) if (!isAuth){ throw redirect("/login") } return {} } export async function doAuthProtectedJob(data){ // do database action without checking anything auth related }
针对你的三个疑问,解答如下:
1. doAuthProtectedJob是否会暴露给外部被直接调用?
不会。doAuthProtectedJob只是你服务端代码中的普通异步函数,Remix框架只会将路由文件中约定的loader、action等特殊函数映射为可通过HTTP访问的端点。除非你手动在路由的action或loader里写逻辑把这个函数暴露出去,否则外部无法通过类似http://some-domain.com/xxx/doAuthProtectedJob的URL直接调用它。
2. 是否需要在doAuthProtectedJob内额外添加认证操作?
分场景判断:
- 若这个函数仅会被已经完成认证校验的代码(比如你当前的
action)调用,则不需要额外添加认证逻辑——因为调用它的入口已经拦截了未授权请求,能走到这一步的请求都是已认证的。 - 若未来存在这个函数被其他未做认证校验的代码调用的可能(比如新增了未加
checkAuthentication的loader/action),则建议在函数内部添加一层认证校验,或者将认证逻辑封装为更通用的守卫,避免出现未授权访问敏感操作的漏洞。就你当前的代码结构而言,暂时不需要额外添加。
3. 通常将认证处理放在actions还是handler中更合适?
更合理的做法是在需要认证的路由的loader和action中都添加认证校验,并尽量复用逻辑:
- 不要只在
action里加认证:loader负责页面数据加载,未授权用户不应该能获取到loader返回的敏感数据,所以loader也需要拦截未授权请求。 - 复用逻辑:如果多个路由都需要认证,建议将
checkAuthentication封装为高阶函数(比如withAuth),用来包装需要认证的loader和action,避免重复写校验代码;也可以使用Remix的路由嵌套或中间件实现全局/批量路由的认证守卫。
内容的提问来源于stack exchange,提问作者punjira
相关产品推荐
相关产品推荐

