You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中多Activity脚本放置、中间件等价实现及认证安全咨询

Android中类似Laravel中间件的实现方案及Launcher Activity认证安全性解析

嘿,这个问题问到点子上了!作为Android开发者,我刚好处理过类似的场景,下面给你详细说说:

一、Android里类似Laravel中间件的实现思路

Laravel的中间件核心是在请求到达控制器前统一处理逻辑,Android里虽然没有完全对应的官方组件,但我们可以通过以下几种方式实现类似效果:

1. 基于BaseActivity的统一校验(最常用)

写一个抽象的基类Activity,让所有需要Token校验的页面都继承它,在基类的生命周期方法(比如onResume)里统一做Token检查。这样只要继承了这个基类的Activity,每次页面可见时都会自动执行校验逻辑,和中间件的“前置拦截”逻辑一致。

举个Kotlin的示例代码:

abstract class BaseAuthenticatedActivity : AppCompatActivity() {
    override fun onResume() {
        super.onResume()
        // 从SharedPreferences或其他存储获取Token
        val authToken = getSharedPreferences("AppSettings", MODE_PRIVATE)
            .getString("auth_token", null)
        
        // 校验Token有效性(比如检查是否过期、是否和服务器端一致)
        if (isTokenInvalid(authToken)) {
            // Token无效时,清除页面栈并跳转到登录页
            val loginIntent = Intent(this, LoginActivity::class.java).apply {
                flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
            }
            startActivity(loginIntent)
            finish()
        }
    }

    // 子类可以自定义Token校验规则
    abstract fun isTokenInvalid(token: String?): Boolean
}

之后你的UserCenterActivity、OrderListActivity等页面直接继承BaseAuthenticatedActivity即可,不用重复写校验代码。

2. Jetpack Compose场景下的组合式校验

如果你的项目用了Compose,可以写一个自定义的Composable组件作为“中间件”,包裹需要授权的内容,在组件内部做Token校验:

@Composable
fun AuthenticatedContent(
    currentToken: String?,
    onTokenInvalid: () -> Unit,
    content: @Composable () -> Unit
) {
    when {
        currentToken.isNullOrEmpty() || isTokenExpired(currentToken) -> {
            // Token无效时,触发跳转或显示登录界面
            LaunchedEffect(Unit) {
                onTokenInvalid()
            }
            LoginScreen(onLoginSuccess = { newToken -> /* 更新Token */ })
        }
        else -> {
            // Token有效,显示正常页面内容
            content()
        }
    }
}

使用时只需要把需要保护的页面内容放到AuthenticatedContent里就行,非常灵活。

3. 自定义路由拦截(进阶方案)

如果你的App有自己的路由管理(比如用ARouter等第三方库,或者原生自定义路由),可以在路由跳转前添加拦截逻辑,检查Token有效性。比如原生路由的话,可以写一个Router类,所有页面跳转都通过这个类,在startActivity方法里先做校验:

object AppRouter {
    fun startAuthenticatedActivity(context: Context, cls: Class<*>) {
        val token = getCurrentToken()
        if (isTokenInvalid(token)) {
            // 跳登录页
            context.startActivity(Intent(context, LoginActivity::class.java))
        } else {
            // 正常跳转目标页面
            context.startActivity(Intent(context, cls))
        }
    }

    // 省略Token相关方法...
}

二、仅在Launcher Activity做身份认证是否安全?

答案是绝对不安全,和Web端只在首页做认证的风险完全一致:

  • Android里用户可以通过多种方式绕过Launcher Activity直接打开其他页面:比如深度链接(Deep Link)、第三方应用唤起、adb命令直接启动Activity(比如adb shell am start -n com.yourapp/.SecretActivity)。
  • 举个实际场景:如果你的App有一个UserInfoActivity用于显示用户敏感信息,而你只在Launcher Activity做了Token校验,那么用户通过adb直接启动UserInfoActivity时,完全可以绕过认证,直接访问敏感内容。

所以正确的做法是:所有需要授权才能访问的页面,都必须做Token校验,也就是用上面提到的BaseActivity或Composable组件的方式,确保每个页面在可见时都能检查Token状态,从根源上避免未授权访问。

内容的提问来源于stack exchange,提问作者Kakashi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:34:06