Android中多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

