Java SSM 项目实战 day04 功能介绍,订单的操作,订单的增删改查,实现登录功能
发布日期:2021-06-29 15:04:14 浏览次数:2 分类:技术文章

本文共 19419 字,大约阅读时间需要 64 分钟。

一、创建数据库

1、用户表

1.1.1 用户表信息描述users

在这里插入图片描述

1.1.2 sql语句

在这里插入图片描述

CREATE TABLE users(   id varchar2(32) default SYS_GUID() PRIMARY KEY,   email VARCHAR2(50) UNIQUE NOT NULL,   username VARCHAR2(50),   PASSWORD VARCHAR2(50),   phoneNum VARCHAR2(20),   STATUS INT )

1.2 角色表

1.2.1 角色表信息描述role

在这里插入图片描述

1.2.2 sql语句

在这里插入图片描述

CREATE TABLE role(  id varchar2(32) default SYS_GUID() PRIMARY KEY,   roleName VARCHAR2(50) ,    roleDesc VARCHAR2(50))
1.2.4 用户与角色关联关系

用户与角色之间是多对多关系,我们通过user_role表来描述其关联,在实体类中User中存在List,在Role中有List.

而角色与权限之间也存在关系,我们会在后面介绍。
在这里插入图片描述

CREATE TABLE users_role(     userId varchar2(32),    roleId varchar2(32),     PRIMARY KEY(userId,roleId),     FOREIGN KEY (userId) REFERENCES users(id),     FOREIGN KEY (roleId) REFERENCES role(id))

1.3 资源权限表

1.3.1 权限资源表描述permission

在这里插入图片描述

在这里插入图片描述

CREATE TABLE permission(   id varchar2(32) default SYS_GUID() PRIMARY KEY,   permissionName VARCHAR2(50) ,   url VARCHAR2(50) )
1.3.4.权限资源与角色关联关系

权限资源与角色是多对多关系,我们使用role_permission表来描述。在实体类Permission中存在List,在Role类中

有List
在这里插入图片描述

CREATE TABLE role_permission(   permissionId varchar2(32),   roleId varchar2(32),   PRIMARY KEY(permissionId,roleId),   FOREIGN KEY (permissionId)  REFERENCES permission(id),  FOREIGN KEY (roleId)   REFERENCES role(id)     )

二、Spring Security

2.1 Spring Security介绍

Spring Security 的前身是 Acegi Security ,是 Spring 项目组中用来提供安全认证服务的框架。

(https://projects.spring.io/spring-security/) Spring Security 为基于J2EE企业应用软件提供了全面安全服务。特别
是使用领先的J2EE解决方案-Spring框架开发的企业软件项目。

人们使用Spring Security有很多种原因,不过通常吸引他们的是在J2EE Servlet规范或EJB规范中找不到典型企业应用场景的解决方案。 特别要指出的是他们不能再

WAR 或 EAR 级别进行移植。

这样,如果你更换服务器环境,就要,在新的目标环境进行大量的工作,对你的应用

系统进行重新配 置安全。

使用Spring Security 解决了这些问题,也为你提供很多有用的,完全可以指定的其他安

全特性。 安全包括两个主要操作。

“认证”,是为用户建立一个他所声明的主体。主题一般式指用户,设备或可以在你系 统中执行动作的其他系

统。
“授权”指的是一个用户能否在你的应用中执行某个操作,在到达授权判断之前,身份的主题已经由 身份验证
过程建立了。

这些概念是通用的,不是Spring Security特有的。

在身份验证层面,Spring Security广泛支持各种身份验证模式,

这些验证模型绝大多数都由第三方提供,或则正在开发的有关标准机构提供的,例如 Internet Engineering Task
Force.作为补充,Spring Security 也提供了自己的一套验证功能。

Spring Security 目前支持认证一体化如下认证技术:

HTTP BASIC authentication headers (一个基于IEFT RFC 的

标准) HTTP Digest authentication headers (一个基于IEFT RFC 的标准)

HTTP X.509 client certificate exchange

(一个基于IEFT RFC 的标准) LDAP (一个非常常见的跨平台认证需要做法,特别是在大环境)

Form-based

authentication (提供简单用户接口的需求) OpenID authentication Computer Associates Siteminder JA-SIG
Central Authentication Service (CAS,这是一个流行的开源单点登录系统) Transparent authentication context
propagation for Remote Method Invocation and HttpInvoker (一个Spring远程调用协议)

在这里插入图片描述

二、实现登录工程

1、创建login.jsp

在这里插入图片描述

<%@ page language="java" contentType="text/html; charset=UTF-8"	pageEncoding="UTF-8"%>
数据 - AdminLTE2定制版 | Log in

2、创建登录失败的页面:failer.jsp

在这里插入图片描述

<%@ page language="java" contentType="text/html; charset=UTF-8"	pageEncoding="UTF-8"%>
数据 - AdminLTE2定制版

3、在web.xml当中配置

在这里插入图片描述

springSecurityFilterChain
org.springframework.web.filter.DelegatingFilterProxy
springSecurityFilterChain
/*

4、创建spring-security.xml

在这里插入图片描述

5、修改web.xml

在这里插入图片描述

contextConfigLocation
classpath*:applicationContext.xml,classpath*:spring-security.xml

6、创建接口IUserService

在这里插入图片描述

在这里插入图片描述

package com.itzheng.ssm.service;import org.springframework.security.core.userdetails.UserDetailsService;public interface IUserService extends UserDetailsService {
}

7、创建一个类UserServiceImpl

在这里插入图片描述

package com.itzheng.ssm.service.impl;import com.itzheng.ssm.service.IUserService;import org.springframework.security.core.userdetails.UserDetails;import org.springframework.security.core.userdetails.UsernameNotFoundException;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Transactional;@Service("userService")@Transactionalpublic class UserServiceImpl implements IUserService {
@Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
return null; }}

8、创建UserInfo类

在这里插入图片描述

package com.itzheng.ssm.domain;//与数据库中users对应public class UserInfo {
private String id; private String username; private String email; private String password; private String phoneNum; private int status; private String statusStr; private List
roles; public String getId() {
return id; } public void setId(String id) {
this.id = id; } public String getUsername() {
return username; } public void setUsername(String username) {
this.username = username; } public String getEmail() {
return email; } public void setEmail(String email) {
this.email = email; } public String getPassword() {
return password; } public void setPassword(String password) {
this.password = password; } public String getPhoneNum() {
return phoneNum; } public void setPhoneNum(String phoneNum) {
this.phoneNum = phoneNum; } public int getStatus() {
return status; } public void setStatus(int status) {
this.status = status; } public String getStatusStr() {
return statusStr; } public void setStatusStr(String statusStr) {
this.statusStr = statusStr; } public List
getRoles() {
return roles; } public void setRoles(List
roles) {
this.roles = roles; }}

9、创建Permission类

在这里插入图片描述

package com.itzheng.ssm.domain;import java.util.List;public class Permission {
private String id; private String permissionName; private String url; private List
roles; public String getId() {
return id; } public void setId(String id) {
this.id = id; } public String getPermissionName() {
return permissionName; } public void setPermissionName(String permissionName) {
this.permissionName = permissionName; } public String getUrl() {
return url; } public void setUrl(String url) {
this.url = url; } public List
getRoles() {
return roles; } public void setRoles(List
roles) {
this.roles = roles; }}

10、创建IUserDao接口

在这里插入图片描述

package com.itzheng.ssm.dao;import com.itzheng.ssm.domain.UserInfo;import org.apache.ibatis.annotations.Select;public interface IUserDao {
@Select("select * from users where username=#{username}") public UserInfo findByUsername(String username) throws Exception;}

11、修改UserServiceImpl的loadUserByUsername方法

在这里插入图片描述

package com.itzheng.ssm.service.impl;import com.itzheng.ssm.dao.IUserDao;import com.itzheng.ssm.domain.UserInfo;import com.itzheng.ssm.service.IUserService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.security.core.userdetails.User;import org.springframework.security.core.userdetails.UserDetails;import org.springframework.security.core.userdetails.UsernameNotFoundException;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Transactional;@Service("userService")@Transactionalpublic class UserServiceImpl implements IUserService {
@Autowired private IUserDao userDao; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
UserInfo userInfo = null; try {
userInfo = userDao.findByUsername(username); } catch (Exception e) {
e.printStackTrace(); } //处理自己的用户对象封装成UserDetails User user = new User(userInfo.getUsername(),userInfo.getPassword(),null); return user; }}

运行以后登录失败

在这里插入图片描述

12、修改UserServiceImpl

在这里插入图片描述

//作用就是返回一个list的集合。而集合当中装入的就是角色的描述    public List
getAuthority() {
List
list = new ArrayList<>(); list.add(new SimpleGrantedAuthority("ROLE_USER")); return list; }

再次运行项目

在这里插入图片描述
在这里插入图片描述
解决以上问题
在这里插入图片描述

User user = new User(userInfo.getUsername(), "{noop}"+userInfo.getPassword(), getAuthority());

在这里插入图片描述

在这里插入图片描述

13、查询用户的时候查询对应的角色

(1)创建 IRoleDao接口

在这里插入图片描述

在这里插入图片描述

package com.itzheng.ssm.dao;import com.itzheng.ssm.domain.Role;import org.apache.ibatis.annotations.Select;import java.util.List;public interface IRoleDao {
//根据用户的id查询出所有用户的角色(通过中间表把所有userId 对应的 roleId 查询出来 在通过 roleId 查询对应的角色信息) @Select("select * from role where id in (select roleId from users_role where userId = #{userId})") public List
findRoleByUserId(String userId) throws Exception;}
(2)修改IUserDao设置Results(结果集)

在这里插入图片描述

package com.itzheng.ssm.dao;import com.itzheng.ssm.domain.UserInfo;import org.apache.ibatis.annotations.Many;import org.apache.ibatis.annotations.Result;import org.apache.ibatis.annotations.Results;import org.apache.ibatis.annotations.Select;public interface IUserDao {
@Select("select * from users where username=#{username}") @Results({
@Result(id=true,property = "id",column = "id"), @Result(property = "username",column = "username"), @Result(property = "email",column = "email"), @Result(property = "password",column = "password"), @Result(property = "phoneNum",column = "phoneNum"), @Result(property = "status",column = "status"), @Result(property = "statusStr",column = "statusStr"), @Result(property = "roles",column = "id", javaType = java.util.List.class ,many = @Many(select = "com.itzheng.ssm.dao.IRoleDao.findRoleByUserId")) }) public UserInfo findByUsername(String username) throws Exception;}
(3)修改UserServiceImpl当中的loadUserByUsername方法和getAuthority方法

在这里插入图片描述

在这里插入图片描述

package com.itzheng.ssm.service.impl;import com.itzheng.ssm.dao.IUserDao;import com.itzheng.ssm.domain.Role;import com.itzheng.ssm.domain.UserInfo;import com.itzheng.ssm.service.IUserService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.security.core.GrantedAuthority;import org.springframework.security.core.authority.SimpleGrantedAuthority;import org.springframework.security.core.userdetails.User;import org.springframework.security.core.userdetails.UserDetails;import org.springframework.security.core.userdetails.UsernameNotFoundException;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Transactional;import java.util.ArrayList;import java.util.Collection;import java.util.List;@Service("userService")@Transactionalpublic class UserServiceImpl implements IUserService {
@Autowired private IUserDao userDao; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
UserInfo userInfo = null; try {
userInfo = userDao.findByUsername(username); } catch (Exception e) {
e.printStackTrace(); } //处理自己的用户对象封装成UserDetails User user = new User(userInfo.getUsername(), "{noop}"+userInfo.getPassword(), getAuthority(userInfo.getRoles())); return user; } //作用就是返回一个list的集合。而集合当中装入的就是角色的描述 public List
getAuthority(List
roles) {
List
list = new ArrayList<>(); for (Role role : roles){
list.add(new SimpleGrantedAuthority("ROLE_"+role.getRoleName())); } return list; }}

14、在登录的时候处理非可用账号的处理

(1)修改UserServiceImpl当中的loadUserByUsername方法

在这里插入图片描述

User user = new User(userInfo.getUsername(),                userInfo.getPassword(),                userInfo.getStatus() == 0 ? false : true,                true,                true,                true,                getAuthority(userInfo.getRoles()));

15、运行测试

(1)默认是账号在可以用的状态

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
报错
在这里插入图片描述
在这里插入图片描述
因为新版security的和旧版security的不兼容

换一下呢

配置pom.xml
在这里插入图片描述

4.0.0
com.itzheng.zheng_ssm
zheng_ssm
pom
1.0-SNAPSHOT
5.0.2.RELEASE
1.6.6
1.2.12
10.2.0.1.0
3.4.5
5.0.1.RELEASE
org.aspectj
aspectjweaver
1.6.8
org.springframework
spring-aop
${spring.version}
org.springframework
spring-context
${spring.version}
org.springframework
spring-context-support
${spring.version}
org.springframework
spring-web
${spring.version}
org.springframework
spring-orm
${spring.version}
org.springframework
spring-beans
${spring.version}
org.springframework
spring-core
${spring.version}
org.springframework
spring-test
${spring.version}
org.springframework
spring-webmvc
${spring.version}
org.springframework
spring-tx
${spring.version}
junit
junit
4.12
test
javax.servlet
javax.servlet-api
3.1.0
provided
javax.servlet.jsp
jsp-api
2.0
provided
jstl
jstl
1.2
log4j
log4j
${log4j.version}
org.slf4j
slf4j-api
${slf4j.version}
org.slf4j
slf4j-log4j12
${slf4j.version}
org.mybatis
mybatis
${mybatis.version}
org.mybatis
mybatis-spring
1.3.0
c3p0
c3p0
0.9.1.2
jar
compile
com.github.pagehelper
pagehelper
5.1.2
org.springframework.security
spring-security-web
${spring.security.version}
org.springframework.security
spring-security-config
${spring.security.version}
org.springframework.security
spring-security-core
${spring.security.version}
org.springframework.security
spring-security-taglibs
${spring.security.version}
com.oracle
ojdbc14
${oracle.version}
javax.annotation
jsr250-api
1.0
org.apache.maven.plugins
maven-compiler-plugin
3.2
1.8
1.8
UTF-8
true
zheng_ssm_dao
zheng_ssm_service
zheng_ssm_domain
zheng_ssm_utils
zheng_ssm_web

再次运行

访问成功
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(2)默认是账号在不可以用的状态

手动改变一些用户的状态

在这里插入图片描述

update users set status = 0;

再次登录

在这里插入图片描述

登录失败
在这里插入图片描述

16、退出登录

使用spring security完成用户退出,非常简单

a、配置(修改)spring-security.xml

在这里插入图片描述

b、header.jsp

在这里插入图片描述

运行测试

在这里插入图片描述
在这里插入图片描述

转载地址:https://code100.blog.csdn.net/article/details/116493691 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Android Studio 实现登录注册-源代码 (连接MySql数据库)
下一篇:Java SSM 项目实战 day03 功能介绍,订单的操作,订单的增删改查

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2024年04月14日 16时34分04秒