Spring Security

Spring Security这种认证服务类的框架必须清除两个概念 认证:是为用户建立一个他所声明的主体。主体一般指用户,设备或可以在你系统中执行动作的其他系统。简单理解是就我们用账号密码登陆的过程 授权:一个用户能否在你的应用中执行某个操作,在到达授权判断之前,身份的主体已经由身份验证过程建立了。 流程:之前的登陆功能是用UserController完成的,使用Spring Security框架后,控制器的工作由框架完成,他来规定初始化页面,登陆的页面,登陆路径,登陆成功或登陆失败如何里跳转等等。认证功能由UserDetailsService完成,我们自己的UserService必须实现UserDetailsService接口,并存入容器,然后再配置文件中配置好。调dao层返回的是自己的User对象,而不是UserDetails,这时要使用Spring Security提供一个UserDetails的实现类User。 我们UserController不再需要了,框架完成UserController的功能,很多东西都需要在Spring Security.xml中进行配置 使用步骤 1.导入依赖 2.在web.xml中创建filter 3.spring security核心配置文件 两种认证方式对比 配置文件进行认证 对比使用数据库认证,常用 其余部分是相同的,重点掌握数据库认证的方式 <--开启方法级别权限控制--> 数据库认证流程 在Spring Security可以使用配置文件进行认证,不常用。在Spring Security中使用数据进行认证操作,我们一般使用UserDetails、UserDetailsService来完成操作。UserDetails是一个接口,用于封装进行认证的用户信息,其中定义了一些用于认证的属性,Spring Security提供一个实现类User。UserDetailsService 也是一个接口,规范了我们进行认证的方法,需要在Spring-Security.xml中把它配置出来。 public interface UserDetailsService { UserDetails loadUserByUsername(String username) throws UsernameNotFoundException; } public interface IUserService extends UserDetailsService{ } @Service("userService") @Transactional public class UserServiceImpl implements IUserService { private IUserDao userDao; @Override public UserDetails[User是spring security 提供的UserDetails实现类] loadUserByUsername(String username) { UserInfo userInfo = null; try { userInfo = userDao.findByUsername(username); } catch (Exception e) { e.printStackTrace(); } User user = new User(userInfo.getUsername(),userInfo.getPassword(),null); return user; } } 服务器端方法级别权限控制 @RolesAllowed 1.导入依赖 javax.annotation jsr250-api 1.0 2.在配置文件中开启jsr250 3.在方法上使用 //查询全部产品 @RolesAllowed("ADMIN") @RequestMapping("/findAll.do") public ModelAndView findAll() throws Exception {...} @Secured 1.是Spring Security框架自带的,不需要像使用jsr250那样额外导入依赖 2.在xml中开启 3.在方法上使用 @Secured("ROLE_ADMIN") 注意:这回不能省略ROLE_ @PreAuthorize 1.在xml中开启 2.在方法上使用 支持注解[还有很多,自行查看]:只有username为tom的用户可以执行save方法 @RequestMapping("/save.do") @PreAuthorize("authentication.principal.username == 'tom'") public String save(Product product) throws Exception {...} 同前两个一样用法,但是需要加上表达式 @PreAuthorize("hasRole('ROLE_ADMIN')") 页面端标签权限控制权限 1.maven导入 org.springframework.security spring-security-taglibs ${spring.security.version} 2.页面导入 <%@taglib prefix="security" uri="http://www.springframework.org/security/tags" %> authentication 此标签代表的是当前认证对象,可以获取当前认证对象信息,例如用户名 property:只允许指定Authentication所拥有的属性,可以进行属性的级联获取,如“principle.username”, 不允许直接通过方法进行调用 htmlEscape:表示是否需要将html进行转义。默认为true。 scope:与var属性一起使用,用于指定存放获取的结果的属性名的作用范围,默认我pageContext。Jsp中拥 有的作用范围都进行进行指定 var: 用于指定一个属性名,这样当获取到了authentication的相关信息后会将其以var指定的属性名进行存 放,默认是存放在pageConext中 authorize 来判断权限的,通过判断用户是否具有对应的权限而控制其所包含内容的显示 access:需要使用表达式来判断权限,当表达式的返回结果为true时表示拥有对应的权限 method:method属性是配合url属性一起使用的,表示用户应当具有指定url指定method访问的权限, method的默认值为GET,可选值为http请求的7种方法 url:url表示如果用户拥有访问指定url的权限即表示可以显示authorize标签包含的内容 var:用于指定将权限鉴定的结果存放在pageContext的哪个属性中 注意:上面需要使用表达式,有两种方式支持表达式 1.在spring-security.xml中开启对表达式的支持(需要更改一些之前的代码,换成表达式) -----对应false ... ... 2.配一个bean,支持对表达式的处理
原文地址:https://www.cnblogs.com/bushishucai/p/10192385.html