(3)登录Controller,对/login请求处理,它调用AuthenticationService完成认证并返回登录结果提示信息:
(4)测试
启动项目,访问/路径地址,进行测试
会话是指用户登入系统后,系统会记住该用户的登录状态,他可以在系统连续操作直到退出系统的过程。 认证的目的是对系统资源的保护,每次对资源的访问,系统必须得知道是谁在访问资源,才能对该请求进行合法性拦截。因此,在认证成功后,一般会把认证成功的用户信息放入Session中,在后续的请求中,系统能够从Session 中获取到当前用户,用这样的方式来实现会话机制。
(1)增加会话控制
首先在UserDto中定义一个SESSION_USER_KEY,作为Session中存放登录用户信息的key。
然后修改LoginController,认证成功后,将用户信息放入当前会话。并增加用户登出方法,登出时将session置为失效。
(2)增加测试资源
修改LoginController,增加测试资源1,它从当前会话session中获取当前登录用户,并返回提示信息给前台。
(3)测试
未登录情况下直接访问测试资源/r/r1:
成功登录的情况下访问测试资源/r/r1:
测试结果说明,在用户登录成功时,该用户信息已被成功放入session,并且后续请求可以正常从session中获取当 前登录用户信息,符合预期结果。
实现授权功能现在我们已经完成了用户身份凭证的校验以及登录的状态保持,并且我们也知道了如何获取当前登录用户(从 Session中获取)的信息,接下来,用户访问系统需要经过授权,即需要完成如下功能:
匿名用户(未登录用户)访问拦截:禁止匿名用户访问某些资源。
登录用户访问拦截:根据用户的权限决定是否能访问某些资源。
(1)增加权限数据
为了实现这样的功能,我们需要在UserDto里增加权限属性,用于表示该登录用户所拥有的权限,同时修改 UserDto的构造方法。
并在AuthenticationServiceImpl中为模拟用户初始化权限,其中张三给了p1权限,李四给了p2权限。
(2)增加测试资源
我们想实现针对不同的用户能访问不同的资源,前提是得有多个资源,因此在LoginController中增加测试资源2。
(3)实现授权拦截器
在interceptor包下定义SimpleAuthenticationInterceptor拦截器,实现授权拦截:
1、校验用户是否登录 2、校验用户是否拥有操作权限