TypechoJoeTheme

LiXiangrong

统计
登录
用户名
密码
/
注册
用户名
邮箱

LiXiangrong

被命运反复捉弄的你呀,收藏了多少动人的情话。

Spring Security入门案例

2021-01-12
/
0 评论
/
397 阅读
/
正在检测是否收录...
01/12

Spring Security入门案例


所用技术:Spring Boot、Spring Security、Thymeleaf、LomBok、MySQL、MyBatis Plus、 Bootstrap、
下面将通过一个简单的入门案例来分享一下Spring Security的强大之处:
该Demo实现了登录的处理和校验、非法访问的拦截、权限控制、自动登录(记住我功能)
源代码下载:链接:https://pan.baidu.com/s/1hzQQLEoBdPLLCKKAN67aiQ
提取码:77jl
复制这段内容后打开百度网盘手机App,操作更方便哦

1.搭建环境,创建项目

首先打开IDEA,新建项目,选择Spring Initializr,下一步之后选择Java版本-8,其他的输入框输入自己想要设置的项目属性或默认即可,在下一步选择依赖页面,选择依赖:

在下一步之后选择项目名和存放的目录,然后点击完成。

2.引入MyBatis Plus依赖

打开pom.xml文件,在的dependencies标签对中加入如下依赖:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.3.1.tmp</version>
</dependency>

3.创建数据库

CREATE database mall;
use mall;
CREATE TABLE 'users' (
  'Id' int(11) NOT NULL AUTO_INCREMENT,
  'username' varchar(255) NOT NULL DEFAULT '' COMMENT '用户名',
  'password' varchar(255) NOT NULL DEFAULT '' COMMENT '登录密码',
  PRIMARY KEY ('Id')
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

INSERT INTO 'users' VALUES (1,'admin','123456');
DROP TABLE IF EXISTS `persistent_logins`;
CREATE TABLE `persistent_logins` (
  `username` varchar(64) COLLATE utf8mb4_bin NOT NULL,
  `series` varchar(64) COLLATE utf8mb4_bin NOT NULL,
  `token` varchar(64) COLLATE utf8mb4_bin NOT NULL,
  `last_used` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`series`)
);

4.编写配置文件application.properties

在配置文件中配置要连接的数据库等

#加载驱动
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#配置数据源
spring.datasource.url=jdbc:mysql://localhost:3306/mall
#设置数据库用户名和密码
spring.datasource.username=root
spring.datasource.password=root
#配置控制台输出SQL语句
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
#设置模板引擎解析的路径
spring.thymeleaf.prefix=classpath:/templates/
#设置thymeleaf模板解析格式
spring.thymeleaf.suffix=.html
#关闭thymeleaf缓存
spring.thymeleaf.cache=false
#server.address=0.0.0.0
#server.port=8081
#server.servlet.context-path=/springboot
#spring.mvc.static-path-pattern=/static/**

5.编写实体类Users

@Data
public class Users {
    private Integer Id;
    private String username;
    private String password;
}

6.编写接口

@Repository
public interface UserMapper extends BaseMapper<Users> {
}

写完接口后要在启动类中加入@MapperScan注解,将接口所在的包作为参数

@SpringBootApplication
@MapperScan("com.mall.mapper")
public class MallApplication {

    public static void main(String[] args) {
        SpringApplication.run(MallApplication.class, args);
    }

}

7.实现UserDetailsService接口

@Service("userDetailsService")
public class MyUserDetailsService implements UserDetailsService {
    @Autowired
    UserMapper userMapper;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        QueryWrapper<Users> wrapper = new QueryWrapper<>();
        wrapper.eq("username",username);
        Users users = userMapper.selectOne(wrapper);
        if (users==null){
            throw new UsernameNotFoundException("用户名不存在!");
        }
        //设置权限
        List<GrantedAuthority> authorities = AuthorityUtils.commaSeparatedStringToAuthorityList("admin");
        return new User(users.getUsername(),new BCryptPasswordEncoder().encode(users.getPassword()),authorities);
    }
}

8.编写控制器

@Controller
public class TestController {

    @RequestMapping("/hello")
    public String hello(){
        return "hello";
    }

    @RequestMapping("/index")
    public String index(){
        return "index";
    }

    @RequestMapping({"/","/login"})
    public String login(){
        return "login";
    }
}

9.编写配置类继承WebSecurityConfigurerAdapter

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private UserDetailsService userDetailsService;
    @Autowired
    private DataSource dataSource;
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception{
        auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
    }
    @Bean
    public PersistentTokenRepository persistentTokenRepository() {
        JdbcTokenRepositoryImpl jdbcTokenRepository = new JdbcTokenRepositoryImpl();
        jdbcTokenRepository.setDataSource(dataSource);
//        jdbcTokenRepository.setCreateTableOnStartup(true);
        return jdbcTokenRepository;
    }
    @Bean
    PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.formLogin()
                .loginPage("/login")    //定制登录页面
                .loginProcessingUrl("/user/login")  //登录的动作处理
                .defaultSuccessUrl("/index").permitAll()    //设置登录成功后的跳转页面
                .and().authorizeRequests()
                //设置那些页面不需要登录权限也能访问
                .antMatchers("/","/login","/hello","/login.html").permitAll()
                .antMatchers("/index").hasAuthority("admin")
                .anyRequest().authenticated()
                .and().rememberMe().tokenRepository(persistentTokenRepository())//设置操作表的Repository
                .tokenValiditySeconds(60 * 60 * 24 * 7)//设置记住我的时间为7天
                .userDetailsService(userDetailsService)//设置userDetailsService
                .and().csrf().disable();
        http.logout().logoutUrl("/logout").logoutSuccessUrl("/hello").permitAll();
    }
    @Override
    public void configure(WebSecurity web) {
        //将项目中静态资源路径开放出来
        web.ignoring().antMatchers("/config/**", "/css/**", "/fonts/**", "/img/**", "/js/**");
    }
}

10.编写html页面

这里,html页面代码就不展示,但是要注意的几点是:1.首先实现登录的action的动作是Spring Security会帮我们实现,只需要将action的属性值和配置类中的.loginProcessingUrl("/user/login")的方法参数对应上即可,登录页面的路由通常是/login,和控制器对应上就行。
2.登录表单的用户名输入框的name属性必须要是name="username",密码输入框的name属性必须要是name="password",否则需要在配置类中进行设置。
3.点击登录的超链接的href设置为点击前往登录!即可。
4.退出登录的超链接的href设置为退出登录即可。
5.记住我的功能是使用了持久化的令牌进行判断,更为安全。<input type="checkbox" name="remember-me"> 记住我,这个标签的name="remember-me",Spring Security会自动将用户名密码加密存入浏览器的cookies和服务器的数据库中,在下次打开页面时Spring Security会自动比对存在于数据库的用户名密码和浏览器的cookies,如果相匹配会自动登录。

springbootSpring SecurityMyBatisPlusThymeleaf
朗读
赞 · 4
版权属于:

LiXiangrong

本文链接:

https://lxrao.com/index.php/archives/35/(转载时请注明本文出处及文章链接)

评论 (0)
本篇文章评论功能已关闭

人生倒计时

今日已经过去小时
这周已经过去
本月已经过去
今年已经过去个月

今日天气

微博热搜榜

  • 获取失败!

标签云