背景
认证与授权是web
开发中绕不开的话题,任何开发的系统都需要对用户身份信息进行认证和授权,那什么是认证和授权呢?其中:认证:就是用户名、密码等进行验证,认证成功之后可以访问系统的信息,否则就拒绝访问;授权:就是对此时的用户权限判断,即根据不同的权限可以访问不同的信息,比如对于一个系统开发者比普通的用户有着更高的权限,开发者可以查询所有的用户信息,而普通的用户只能管理自己的信息。
认证
对于一个系统,我们第一次访问的时候会进行登录,输入登录信息之后,后端对信息进行判断,如果对比成功之后你就可以访问网站的信息,每次访问都需要进行验证,如果都是携带用户名和密码就会很容易被截取,导致密码泄露。所以在第一次登陆成功之后,后端会为每个用户生成一个令牌(token
),之后每次访问的时候就携带token
就可以啦,不用携带用户名和密码,但可能有人问,token
也会被截取呢?虽然也会被截取,但我们生成的token
是具有时效性的,如果过了一段时间后,该token
就会失效,会重新刷新token
。而token
的生成主要有两种方式,第一种是使用redis
,生成一个随机的字符串作为key
,用户信息作为value
,key
作为token
在前后端传递。第二种是jwt
,这种就是用户的信息就直接保存在jwt
这个加密字符串中,这个就很依赖加密算法。
Spring Security实现认证
在spring
框架中,spring security
主要的功能就是解决认证和授权,当我们进行登录的时候,输入用户名和密码的时候会进入spring security
提供的过滤器:UsernamePasswordAuthenticationFilter
,接着该过滤器会将用户名和密码封装成:UsernamePasswordAuthenticationToken
,之后进入AuthenticationManager
接口进行处理,而这个接口的实现类:ProviderManager
则主要用于身份的认证,在该类中提供了authenticate
方法,该方法实现了具体的认证。
授权
对于授权,一般采用了用户-角色-权限的方式,这时在数据库存在五张表,首先是用户表、角色表、权限表、用户-角色关联表、角色-权限关联表,其流程为:首先根据登录的用户名,查询用户信息,接着设置该用户所具有的角色,得到角色就可以得到权限,这样用户和权限就对应起来了。那这里的权限具体的体现在哪里呢?前端通过URL访问后端的数据,所以这里我们会把URL
和角色对应起来,即该URL
需要什么样的角色才能访问,之前的用户和角色对应起来了,最后不同的用户和访问到不一样的资源啦。
Spring Security实现授权
在授权中,FilterInvocationSecurityMetadataSource
起着很重要的作用,它主要是根据用户传来的请求地址,分析出请求需要的角色。得到每个请求地址需要的角色后,进入AccessDecisionManager
决策器,使用它来判断用户是否可以访问URL的资源。