精华内容
参与话题
问答
  • http 协议支持的认证方式:basic基本认证和digest摘要认证,下面将展示如何进行基于用户的basic 认证 basic 认证机制的实现 1.定义安全区域 在 /etc/httpd/conf/httpd.conf 定义安全区域 Directory /var/...

    http 协议支持的认证方式:basic基本认证和digest摘要认证,下面将展示如何进行基于用户的basic 认证
    basic 认证机制的实现

    1.定义安全区域
    在 /etc/httpd/conf/httpd.conf 定义安全区域

    Directory /var/www/html/admin #"安全区域的路径'
     authType Basic
     options None
     authname "administrator private"
     authuserfile "/etc/httpd/conf.d/.htpasswd"  #"定义认证的用户名密码和文件'
     require valid-user  #"这里也可以写具体的用户名称,但是用户多的话比较麻烦'
      AllowOverride None
       </Directory>

    2 创建安全区域
    mkdir -p /var/www/html/admin #创建安全区域
    [root@Centos6.9 html]#ll admin
    -rw-r–r–. 1 root root 39 Sep 23 10:32 index.html

    3.提供账号和密码存储(文本文件)
    使用专用命令完成此类文件的创建及用户管理
    htpasswd
    -c:自动创建文件,仅应该在文件不存在时使用
    -m: md5格式加密
    -s: sha格式加密
    -D:删除指定用户

    #用htpasswd 创建jerry 和tom 两个用户
    htpasswd -c -m /etc/httpd/conf.d/.htpasswd jerry 
    [root@Centos6.9 app]#htpasswd -m /etc/httpd/conf.d/.htpasswd tom     
    New password: 
    Re-type new password: 
    Adding password for user tom
    [root@Centos6.9 app]#cat /etc/httpd/conf.d/.htpasswd 
    jerry:$apr1$MtyXGJYN$mqfALlDq9Q/4bvi/oVJBK.
    tom:$apr1$jtC1iK50$bZeJK5F2dt91HtZFsFTnX.

    4 测试

    在电脑浏览器输入apache 服务器安全域的地址会看到提示用户输入信息,输入用户和密码后成功进入
    这里写图片描述
    这样我们已经成功实现了apach 基于用户basic 认证了,如果用组认证
    方法类似。

    5 basic 组认证

    vim /etc/httpd/conf/httpd.conf 定义安全区域
    Directory /var/www/html/admin   #安全区域的路径
     authType Basic
     options None
     authname "administrator private"
     authuserfile "/etc/httpd/conf.d/.htpasswd"  #定义认证的用户名密码和文件
     authgroupfile "/etc/httpd/conf.d/.htgroup"  #定义认证的组文件
     require group grp1 grp2 ...   #grp1 grp2 是组名称
      AllowOverride None
       </Directory>
    
    组文件格式: groupname : user1 user ....
    [root@Centos6.9 app]#vim /etc/httpd/conf.d/.htgroup
    grp1:  tom jerry

    虚拟主机
    一个虚拟主机可以服务多个站点,每个站点可通过一个或者多个虚拟主机来实现。httpd 有三种类型虚拟主机:
    基于ip
    基于port 在实际中很少使用
    基于fqdn
    也可以混合使用,一般虚拟主机不要和中心主机混用
    所以要使用虚拟主机,先禁用中心主机。禁用虚拟主机:注释DocumentRoot

    定义虚拟主机方法:
    1. 开启虚拟主机需要先关闭 Main server

    vim /etc/httpd/conf/httpd.conf
    #DocumentRoot "/var/www/html"  #"注释或者删掉该行
    1. 定义虚拟主机
    NameVirtualHost 192.168.10.52:80  #"apache 2.2 这个一定要配置,apache 2.4 不需要"
    <VirtualHost 192.168.10.52:80>
    ServerName china.com
        DocumentRoot /vhost/web1/htdosc
    </VirtualHost>  
    
    <VirtualHost 192.168.10.52:80>
    ServerName china2.com
        DocumentRoot /vhost/web2/htdosc
    </VirtualHost>

    3 定义虚拟主机文件
    [root@Centos6.9 html]#mkdir -p /vhost/web1/htdosc
    [root@Centos6.9 html]#mkdir -p /vhost/web2/htdosc
    再分别定义这里面的主页文件 index.html
    vim /vhost/web1/htdosc/index.html
    This is china.com test
    vim /vhost/web2/htdosc/index.html
    This is china2.com test2
    4 客户端测试
    客户端在用域名访问之前要确保能够正确解析 china.com 和 china2.com 两个域名。本次实验通过添加hosts 文件来实现解析。

    [root@centos7 ~]#cat /etc/hosts
    127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
    192.168.10.52  china.com china2.com
    之后进行测试:
    [root@centos7 ]#curl  china.com
    This is china.com test1
    [root@centos7 ]#curl  china2.com
    This is china2.com test2

    这样基于域名的虚拟主机已经实现了。下面附上其他的配置实例:

    基于IP的虚拟主机示例:

    <VirtualHost 172.16.100.6:80>
    ServerName www.a.com
    DocumentRoot "/www/a.com/htdocs"
    </VirtualHost>
    <VirtualHost 172.16.100.7:80>
    ServerName www.b.net
    DocumentRoot "/www/b.net/htdocs"
    </VirtualHost>
    <VirtualHost 172.16.100.8:80>
    ServerName www.c.org
    DocumentRoot "/www/c.org/htdocs"
    </VirtualHost>
    
    基于端口的虚拟主机:可和基于IP的虚拟主机混和使用
    listen 808
    listen 8080
    <VirtualHost 172.16.100.6:80>
    ServerName www.a.com
    DocumentRoot "/www/a.com/htdocs"
    </VirtualHost>
    <VirtualHost 172.16.100.6:808>
    ServerName www.b.net
    DocumentRoot "/www/b.net/htdocs"
    </VirtualHost>
    <VirtualHost 172.16.100.6:8080>
    ServerName www.c.org
    DocumentRoot "/www/c.org/htdocs"
    </VirtualHost>
    http2.4 配置方法:
    <VirtualHost *:80>
    ServerName www.a.com
    DocumentRoot /vhost/a.com
    <directory /vhost/a.com>
    require all granted
    </directory>
    </VirtualHost>
    
    展开全文
  • apache shiro实现用户登录功能配置shiro的Filter实现URL级别权限控制 配置web.xml <!-- shiro的过滤器 --> <!-- 应用配置后将会去spring的配置文件中寻找与shiroFilter同名的bean --> <filter-name>shiroFilter ...

    apache shiro实现用户登录功能

    配置shiro的Filter实现URL级别权限控制

    配置web.xml

    <!-- shiro的过滤器 -->
    <filter>
        <!-- 应用配置后将会去spring的配置文件中寻找与shiroFilter同名的bean -->
        <filter-name>shiroFilter</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>shiroFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    

    配置applicationContext-shiro.xml,并在applicationContext.xml中引入applicationContext-shiro.xml。

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns:task="http://www.springframework.org/schema/task"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/data/jpa 
        http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
    
    <!-- 配置Shiro核心Filter  --> 
    <bean id="shiroFilter" 
        class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <!-- 安全管理器 -->
        <property name="securityManager" ref="securityManager" />
        <!-- 未认证,跳转到哪个页面  -->
        <property name="loginUrl" value="/login.html" />
        <!-- 登录页面页面 -->
        <property name="successUrl" value="/index.html" />
        <!-- 认证后,没有权限跳转页面 -->
        <property name="unauthorizedUrl" value="/unauthorized.html" />
        <!-- shiro URL控制过滤器规则  -->
        <property name="filterChainDefinitions">
            <value>
                /login.html* = anon
                /user_login.action* = anon 
                /validatecode.jsp* = anon
                /css/** = anon
                /js/** = anon
                /images/** = anon
                /services/** = anon 
                /pages/base/courier.html* = perms[courier:list]
                /pages/base/area.html* = roles[base]
                /** = authc
            </value>
        </property>
    </bean>
    
    <!-- 安全管理器  -->
    <bean id="securityManager" 
        class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <property name="realm" ref="bosRealm" />
        <property name="cacheManager" ref="shiroCacheManager" />
    </bean>
    
    <!-- 配置Realm -->
    <bean id="bosRealm" class="cn.niwotaxuexiba.bos.realm.BosRealm">
        <!-- 缓存区的名字 就是 ehcache.xml 自定义 cache的name -->
        <property name="authorizationCacheName" value="bos" />
    </bean>
    
    <bean id="lifecycleBeanPostProcessor"
        class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
    
    <!-- 开启shiro注解模式  -->
    <bean
        class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
        depends-on="lifecycleBeanPostProcessor" >
        <property name="proxyTargetClass" value="true" />
    </bean>
    
    <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
         <property name="securityManager" ref="securityManager"/>
    </bean>
    
    </beans>
    

    在applicationContext.xml中引入applicationContext-shiro.xml

    <!-- 引入shiro的配置 -->
    <import resource="applicationContext-shiro.xml"/>
    

    前端页面代码编写

    设置form表单的action

    <form class="form-horizontal" id="loginform" name="loginform" method="post" action="user_login.action>
        ...
    </form>
    

    点击立即登录按钮,提交form表单

    <a href="javascript:$('#loginform').submit();" class="btn btn-danger" target="_blank">
        立即登录
    </a>
    

    后台Java代码实现

    编写UserAction,提供login登录方法

    @Namespace("/")
    @ParentPackage("json-default")
    @Controller
    @Scope("prototype")
    public class UserAction extends BaseAction<User> {
        @Action(value = "user_login", results = {
            @Result(name = "login", type = "redirect", location = "login.html"),
            @Result(name = "success", type = "redirect", location = "index.html") })
        public String login() {
            // 用户名和密码 都保存在model中
            // 基于shiro实现登录
            Subject subject = SecurityUtils.getSubject();
    
            // 用户名和密码信息
            AuthenticationToken token = new UsernamePasswordToken(
                    model.getUsername(), model.getPassword());
            try {
                subject.login(token);
                // 登录成功
                // 将用户信息 保存到 Session
                return SUCCESS;
            } catch (AuthenticationException e) {
                // 登录失败
                e.printStackTrace();
                return LOGIN;
            }
        }
    }
    

    shiro的执行流程是:应用程序–>Subject–>SecurityManager–>Realm–>安全数据

    自定义Realm对象,实现认证方法。自定义的Realm接口需要集成AuthorizingRealm接口。

    //自定义的Realm,实现 安全数据的连接
    @Service("bosRealm")
    public class BosRealm extends AuthorizingRealm {
        @Autowired
        private UserService userService;
        @Override
        //授权
        protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection pc) {
            System.out.println("shiro 授权管理...");
            return null;
        }
    
        @Override
        // 认证...
        protected AuthenticationInfo doGetAuthenticationInfo(
                AuthenticationToken token) throws AuthenticationException {
            System.out.println("shiro 认证管理... ");
    
            // 转换token
            UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;
    
            // 根据用户名 查询 用户信息
            User user = userService.findByUsername(usernamePasswordToken
                    .getUsername());
            if (user == null) {
                // 用户名不存在
                // 参数一: 期望登录后,保存在Subject中信息
                // 参数二: 如果返回为null 说明用户不存在,报用户名
                // 参数三 :realm名称
                return null;
            } else {
                // 用户名存在
                // 当返回用户密码时,securityManager安全管理器,自动比较返回密码和用户输入密码是否一致
                // 如果密码一致 登录成功, 如果密码不一致 报密码错误异常
                return new SimpleAuthenticationInfo(user, user.getPassword(),
                        getName());
            }
    
        }
    
    }
    

    将自定义的Realm注入到安全管理器SecurityManager中。

    <!-- 安全管理器  -->
    <bean id="securityManager" 
        class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <property name="realm" ref="bosRealm" />
        <property name="cacheManager" ref="shiroCacheManager" />
    </bean>
    

    service代码

    @Service
    @Transactional
    public class UserServiceImpl implements UserService {
        @Autowired
        private UserRepository userRepository;
        @Override
        public User findByUsername(String username) {
            return userRepository.findByUsername(username);
        }
    
    }
    

    dao代码

    public interface UserRepository extends JpaRepository<User, Integer> {
    
        User findByUsername(String username);
    
    }
    

    在shiroFilter中将user_login.action放行

    <!-- shiro URL控制过滤器规则  -->
    <property name="filterChainDefinitions">
        <value>
            /login.html* = anon
            /user_login.action* = anon<!-- 放行 --> 
            /validatecode.jsp* = anon
            /css/** = anon
            /js/** = anon
            /images/** = anon
            /services/** = anon 
            /pages/base/courier.html* = perms[courier:list]
            /pages/base/area.html* = roles[base]
            /** = authc
        </value>
    </property>
    
    展开全文
  • <div><p>按照配置配好ApacheDS后用admin secret无法登录,提示"登录凭证错误!"</p><p>该提问来源于开源项目:ixrjog/opscloud</p></div>
  • Apache服务器已经内置用户验证机制,大家只要适当的加以设置,便可以控制网站的某些部分要用户验证。 [b]第1步:[/b] 我们在/usr/local/apache/htdocs/(apache的主页根目录)下建立一个demo目录 [code="cmd&...
    Apache服务器已经内置用户验证机制,大家只要适当的加以设置,便可以控制网站的某些部分要用户验证。
    [b]第1步:[/b]
    我们在/usr/local/apache/htdocs/(apache的主页根目录)下建立一个demo目录
    mkdir /usr/local/apache/htdocs/demo

    [b]第2步[/b]
    然后我们编辑httpd.conf
    添加

    Alias /demo "/usr/local/apache/htdocs/demo"
    <Directory "/usr/local/apache/htdocs/demo">
    Options Indexes MultiViews
    AllowOverride AuthConfig
    Order allow,deny
    Allow from all
    </Directory>

    #AllowOverride AuthConfig 表示进行身份验证这是关键的设置
    [b]第3步[/b]
    在/usr/local/apache/htdocs/demo创建.htaccess文件
    vi /usr/local/apache/htdocs/demo /.htaccess


    AuthName " my share web"
    AuthType Basic
    AuthUserFile /usr/local/apache/htdocs/demo/.htpasswd
    require valid-user

    #AuthName 描述,随便写
    #AuthUserFile /var/www/test/.htpasswd
    #密码文件推荐使用.htpasswd,因为apache默认系统对“.ht”开头的文件默认不允许外部读取,安全系数会高一点哦。
    说明:文件.htaccess中常用的配置命令有以下几个:
      1) AuthName命令:指定认证区域名称。区域名称是在提示要求认证的对话框中显示给用户的(见附图)。
      2)AuthType命令:指定认证类型。在HTTP1.0中,只有一种认证类型:basic。在HTTP1.1中有几种认证类型,如:MD5。
      3) AuthUserFile命令:指定一个包含用户名和密码的文本文件,每行一对。
      4) AuthGroupFile命令:指定包含用户组清单和这些组的成员清单的文本文件。组的成员之间用空格分开,如:
      managers:user1 user2
      5) require命令:指定哪些用户或组才能被授权访问。如:
      require user user1 user2(只有用户user1和user2可以访问)
      requiresgroupsmanagers (只有组managers中成员可以访问)
      require valid-user (在AuthUserFile指定的文件中任何用户都可以访问)
    [b]第4步[/b]
    就是创建apache的验证用户

    htpasswd -c /usr/local/apache/htdocs/test/.htpasswd admin //添加用户llk726


    New password: 111111
    Re-type new password:111111
    Adding password for user admin

    #第一次创建用户要用到-c 参数 第2次添加用户,就不用-c参数
    如果你们想修改密码,可以如下
    htpasswd -m .htpasswd admin

    [b]第5步:[/b]
    ok,重启apache服务,然后访问 [url]http://localhost/demo [/url] 如果顺利的话,应该能看到一个用户验证的弹出窗口,只要填入第4步创建的用户名和密码就行
    展开全文
  • 一.简介  1. 权限框架主要有三种: ① 自己写权限框架 ② Spring Security (使用复杂, 依赖 Spring ) ③ Apache Shiro (更轻量, 使用更...用户登录功能实现. 1.配置web.xml 代码: shiroFilter

    一.简介

     1.  权限框架主要有三种:

    ① 自己写权限框架
    ② Spring Security (使用复杂, 依赖 Spring )
    Apache Shiro (更轻量, 使用更简单, 并不完全依赖 spring,可以独立使用 )

    2.导入jar包(版本1.3.2)

    二.用户登录功能实现.

    1.配置web.xml

    代码:

    	<!--Shiro的Filter -->
    	<filter>
    		<!-- 去spring配置文件中寻找同名bean -->
    		<filter-name>shiroFilter</filter-name>
    		<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    	</filter>
    	<filter-mapping>
    		<filter-name>shiroFilter</filter-name>
    		<url-pattern>/*</url-pattern>
    	</filter-mapping>
    

    2.配置applicationContext-shiro.xml(别忘了在applicationContext.xml中引入)

    代码:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    	xmlns:context="http://www.springframework.org/schema/context"
    	xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:tx="http://www.springframework.org/schema/tx"
    	xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns:task="http://www.springframework.org/schema/task"
    	xsi:schemaLocation="
    		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
    		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
    		http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
    		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
    		http://www.springframework.org/schema/data/jpa 
    		http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
    
    	<!-- 配置Shiro核心Filter -->
    	<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
    		<!-- 安全管理器 -->
    		<property name="securityManager" ref="securityManager" />
    		<!-- 未认证,跳转到哪个页面 -->
    		<property name="loginUrl" value="/login.html" />
    		<!-- 登录页面页面 -->
    		<property name="successUrl" value="/index.html" />
    		<!-- 认证后,没有权限跳转页面 -->
    		<property name="unauthorizedUrl" value="/unauthorized.html" />
    		<!-- shiro URL控制过滤器规则 -->
    		<property name="filterChainDefinitions">
    			<value>
    				/login.html* = anon
    				/user_login.action* = anon
    				/validatecode.jsp* = anon
    				/css/** = anon
    				/js/** = anon
    				/images/** =anon
    				/services/** = anon
    				/pages/base/courier.html* = perms[courier:list]
    				/pages/base/area.html* = roles[base]
    				/** =authc
    			</value>
    		</property>
    	</bean>
    
    	<!-- 安全管理器 -->
    	<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
    		<property name="realm" ref="bosRealm" />
    	</bean>
    	<!-- 配置Realm -->
    	<bean id="bosRealm" class="cn.itcast.bos.realm.BosRealm">
    		<!-- 缓存区的名字 就是 ehcache.xml 自定义 cache的name -->
    		<property name="authorizationCacheName" value="bos" />
    	</bean>
    
    	<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />
    </beans>
    ※-->过滤器:

         ①anon 未认证可以访问
         ②authc 认证后可以访问
         ③perms 需要特定权限才能访问
         ④roles 需要特定角色才能访问
         ⑤user 需要特定用户才能访问
         ⑥port 需要特定端口才能访问
         ⑦reset 根据指定 HTTP 请求访问才能访问

         ⑧perms[courier:list]:用于用户权限控制,后面会有写到.


    3.页面代码.

    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="UTF-8">
    		<meta name="viewport" content="width=device-width,innitial-scale=1">  
    		<title>BOS管理系统 登陆页面</title>
    		<script src="./js/jquery-1.8.3.js" type="text/javascript"></script>
    		<link rel="stylesheet" type="text/css" href="css/bootstrap.css">
    		<link rel="stylesheet" type="text/css" href="css/login.css">
    	</head>
    	
    	<body>
    		<div class="loginbox">
    		<div class="loginnav">
    			<nav class="navbar navbar-default">
    				<div class="container">
    					<div class="navbar-header">
    						<a class="navbar-brand" href="#"><img src="images/logo.png"></a>
    						<span class="logintitle">员工登录</span>
    					</div>
    				</div>
    			</nav>
    		</div>
    		
    		<section class="mainlogin">
    			<div class="container">
    				<div class="col-md-4 col-md-offset-7 logincontent">
    					<h4>员工登录</h4>
    					<form class="form-horizontal" id="loginform" name="loginform" method="post" action="user_login.action">
    						<div class="form-group" id="idInputLine">
    							<label for="inputPassword3" class="col-sm-3 control-label">账号</label>
    							<div class="col-sm-8">
    								<input id="loginform:idInput" type="text" name="username" class="form-control" placeholder="请输入手机号/邮箱/用户名">
    							</div>
    						</div>
    						<div class="form-group" id="pwdInputLine">
    							<label id="loginform:pwdInput" class="col-sm-3 control-label" >密码</label>
    							<div class="col-sm-8">
    								<input for="pwdInput" type="password" name="password" class="form-control" id="inputaccount" placeholder="请输入您的密码">
    							</div>
    						</div>
    						<div class="form-group">
    							<label for="inputvalidate" class="col-sm-3 control-label">验证码</label>
    							<div class="col-sm-4">
    								<input type="text" class="form-control" id="inputaccount" placeholder="请输入验证码">
    							</div>
    							<div class="col-sm-4">
    								<img id="loginform:vCode" src="validatecode.jsp"  οnclick="javascript:document.getElementById('loginform:vCode'). src='validatecode.jsp?'+Math.random();" />
    							</div>
    						</div>
    						<div class="form-group">
    							
    							<div class="col-sm-offset-3 col-sm-4">
    								<input type="checkbox"><span class="size12"> 记住用户名</span>
    							</div>
    							<div class="col-sm-4">
    								<a href="#"><span class="size12 forget">忘记密码</span></a>
    							</div>
    						</div>
    						<div class="col-md-offset-3 col-md-8">
    							<a href="javascript:$('#loginform').submit();" id="loginform:j_id19" name="loginform:j_id19"
    								 class="btn btn-danger" >立即登录</a>
    							
    						</div>
    					</form>
    				</div>
    			</div>
    		</section>
    
    		<footer class="clearfix">
    			<div class="container">
    			<p class="text-center">地址:北京市昌平区建材城西路金燕龙办公楼一层 邮编:100096 电话:400-618-4000 传真:010-82935100 </p>
    <p  class="text-center">京ICP备08001421号京公网安备110108007702</p>
    </div>
    		</footer>
    		</div>
    	</body>
    </html>

    注意:红色的"action"的字段在过滤器中是"/user_login.action* = anon",意思就是这个action可以不用认证(没有登录)就可以访问.

    4.UserAction提供"login"登录的方法

    package cn.itcast.bos.web.action.base.system;
    
    import org.apache.shiro.SecurityUtils;
    import org.apache.shiro.authc.AuthenticationException;
    import org.apache.shiro.authc.UsernamePasswordToken;
    import org.apache.shiro.subject.Subject;
    import org.apache.struts2.convention.annotation.Action;
    import org.apache.struts2.convention.annotation.Namespace;
    import org.apache.struts2.convention.annotation.ParentPackage;
    import org.apache.struts2.convention.annotation.Result;
    import org.springframework.context.annotation.Scope;
    import org.springframework.stereotype.Controller;
    
    import cn.itcast.bos.system.User;
    
    import com.opensymphony.xwork2.ActionSupport;
    import com.opensymphony.xwork2.ModelDriven;
    
    @ParentPackage("json-default")
    @Namespace("/")
    @Controller
    @Scope("prototype")
    public class UserAction extends ActionSupport implements ModelDriven<User> {
    
    	private User user = new User();
    
    	@Override
    	public User getModel() {
    		return user;
    	}
    
    	@Action(value = "user_login", results = {
    			@Result(name = "login", type = "redirect", location = "login.html"),
    			@Result(name = "success", type = "redirect", location = "index.html") })
    	public String login() {
    		//基于Shiro实现登录
    		Subject subject = SecurityUtils.getSubject();
    		
    		//用户名和密码信息
    		UsernamePasswordToken token = new UsernamePasswordToken(user.getUsername(),user.getPassword());
    		
    		try {
    			subject.login(token);
    			//登录成功,将用户信息保存到session当中
    			return SUCCESS;
    		} catch (AuthenticationException e) {
    			//登录失败
    			e.printStackTrace();
    			return LOGIN;
    		}
    		
    	}
    	
    	//用户推出登录
    	@Action(value="user_logout",results={@Result(name="success",type="redirect",location="login.html")})
    	public String logout(){
    		Subject subject = SecurityUtils.getSubject();
    		subject.logout();
    		return SUCCESS;
    	}
    }
    

    Shiro 执行流程: 应用程序 --- Subject(action) --- SecurityManager(xml) --- Realm 安全数据

    5.自定义Realm对象(实际开发中,只需要继承 AuthorizingRealm )

    ①将自定义 Realm 注入安全管理器 SecurityManager 当中

    <!-- 安全管理器 -->
    	<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
    		<property name="realm" ref="bosRealm" />
    	</bean>
    ②Realm

    package cn.itcast.bos.realm;
    
    
    import java.util.List;
    
    import org.apache.shiro.SecurityUtils;
    import org.apache.shiro.authc.AuthenticationException;
    import org.apache.shiro.authc.AuthenticationInfo;
    import org.apache.shiro.authc.AuthenticationToken;
    import org.apache.shiro.authc.SimpleAuthenticationInfo;
    import org.apache.shiro.authc.UsernamePasswordToken;
    import org.apache.shiro.authz.AuthorizationInfo;
    import org.apache.shiro.authz.SimpleAuthorizationInfo;
    import org.apache.shiro.realm.AuthorizingRealm;
    import org.apache.shiro.subject.PrincipalCollection;
    import org.apache.shiro.subject.Subject;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import cn.itcast.bos.service.base.system.PermissionService;
    import cn.itcast.bos.service.base.system.RoleService;
    import cn.itcast.bos.service.base.system.Userservice;
    import cn.itcast.bos.system.Permission;
    import cn.itcast.bos.system.Role;
    import cn.itcast.bos.system.User;
    
    
    // 自定义Realm ,实现安全数据 连接
     @Service("bosRealm")
    public class BosRealm extends AuthorizingRealm {
    
    	@Autowired
    	private Userservice userService;
    	
    	@Autowired
    	private RoleService roleService;
    
    	@Autowired
    	private PermissionService permissionService;
    
    
    	
    	@Override
    	// 认证...
    	protected AuthenticationInfo doGetAuthenticationInfo(
    			AuthenticationToken token) throws AuthenticationException {
    		System.out.println("shiro 认证管理... ");
    
    		// 转换token
    		UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;
    
    		// 根据用户名 查询 用户信息
    		User user = userService.findByUsername(usernamePasswordToken
    				.getUsername());
    		if (user == null) {
    			// 用户名不存在
    			// 参数一: 期望登录后,保存在Subject中信息
    			// 参数二: 如果返回为null 说明用户不存在,报用户名
    			// 参数三 :realm名称
    			return null;
    		} else {
    			// 用户名存在
    			// 当返回用户密码时,securityManager安全管理器,自动比较返回密码和用户输入密码是否一致
    			// 如果密码一致 登录成功, 如果密码不一致 报密码错误异常
    			return new SimpleAuthenticationInfo(user, user.getPassword(),
    					getName());
    		}
    
    	}
    }
    红色:错误异常请参考我的博客"最权威正解Submitted credentials for token [xxx]] did not match the expected credentials."这篇文章

    ③Service和Dao代码

    package cn.itcast.bos.service.base.system;
    
    import cn.itcast.bos.system.User;
    
    public interface Userservice {
    
    	public User findByUsername(String username);
    }
    

    package cn.itcast.bos.service.base.impl;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
    
    import cn.itcast.bos.dao.base.system.UserRepository;
    import cn.itcast.bos.service.base.system.Userservice;
    import cn.itcast.bos.system.User;
    @Service
    @Transactional
    public class UserServiceImpl implements Userservice{
    
    	@Autowired
    	private UserRepository userRepository;
    
    	@Override
    	public User findByUsername(String username) {
    		 return userRepository.findByUsername(username);
    	}
    	
    }
    

    package cn.itcast.bos.dao.base.system;
    
    import org.springframework.data.jpa.repository.JpaRepository;
    import org.springframework.stereotype.Repository;
    
    import cn.itcast.bos.system.User;
    @Repository
    public interface UserRepository extends JpaRepository<User, Integer>{
    	public User findByUsername(String username);
    }
    

    6.在user表中插入临时用户密码数据,可以校验代码是否正确;

    三,用户授权

    1.表之间的关系;

    菜单,权限,角色,用户

    ①用户:每个用户属于一个角色


    ②每个角色有相应的权限,还有对应的菜单

    总结:每一位用户都有对应的权限,也有属于自己的菜单列表(动态显示菜单,后面有

    2.实现 Realm的授权方法

    完整的Realm(包括认证和授权)的代码:

    package cn.itcast.bos.realm;
    
    
    import java.util.List;
    
    import org.apache.shiro.SecurityUtils;
    import org.apache.shiro.authc.AuthenticationException;
    import org.apache.shiro.authc.AuthenticationInfo;
    import org.apache.shiro.authc.AuthenticationToken;
    import org.apache.shiro.authc.SimpleAuthenticationInfo;
    import org.apache.shiro.authc.UsernamePasswordToken;
    import org.apache.shiro.authz.AuthorizationInfo;
    import org.apache.shiro.authz.SimpleAuthorizationInfo;
    import org.apache.shiro.realm.AuthorizingRealm;
    import org.apache.shiro.subject.PrincipalCollection;
    import org.apache.shiro.subject.Subject;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import cn.itcast.bos.service.base.system.PermissionService;
    import cn.itcast.bos.service.base.system.RoleService;
    import cn.itcast.bos.service.base.system.Userservice;
    import cn.itcast.bos.system.Permission;
    import cn.itcast.bos.system.Role;
    import cn.itcast.bos.system.User;
    
    
    // 自定义Realm ,实现安全数据 连接
     @Service("bosRealm")
    public class BosRealm extends AuthorizingRealm {
    
    	@Autowired
    	private Userservice userService;	//用户
    	
    	@Autowired
    	private RoleService roleService;//角色
    
    	@Autowired
    	private PermissionService permissionService;//权限名称
    
    
    	
    	@Override
    	// 认证...
    	protected AuthenticationInfo doGetAuthenticationInfo(
    			AuthenticationToken token) throws AuthenticationException {
    		System.out.println("shiro 认证管理... ");
    
    		// 转换token
    		UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;
    
    		// 根据用户名 查询 用户信息
    		User user = userService.findByUsername(usernamePasswordToken
    				.getUsername());
    		if (user == null) {
    			// 用户名不存在
    			// 参数一: 期望登录后,保存在Subject中信息
    			// 参数二: 如果返回为null 说明用户不存在,报用户名
    			// 参数三 :realm名称
    			return null;
    		} else {
    			// 用户名存在
    			// 当返回用户密码时,securityManager安全管理器,自动比较返回密码和用户输入密码是否一致
    			// 如果密码一致 登录成功, 如果密码不一致 报密码错误异常
    			return new SimpleAuthenticationInfo(user, user.getPassword(),
    					getName());
    		}
    
    	}
    
    
    	@Override
    	// 授权...
    	protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection pc) {
    		System.out.println("shiro 授权管理...");
    		SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
    		// 根据当前登录用户 查询对应角色和权限
    		Subject subject = SecurityUtils.getSubject();
    		User user = (User) subject.getPrincipal();
    		// 调用业务层,查询角色
    		List<Role> roles = roleService.findByUser(user);
    		for (Role role : roles) {
    			authorizationInfo.addRole(role.getKeyword());
    		}
    		// 调用业务层,查询权限
    		List<Permission> permissions = permissionService.findByUser(user);
    		for (Permission permission : permissions) {
    			authorizationInfo.addStringPermission(permission.getKeyword());
    		}
    
    		return authorizationInfo;
    	}
    }
    
    授权:将用户对应的权限查询出

    博主还没有弄懂查询用户权限之后返回到哪去了!!!知道的小伙请在下面留言,或者去哪个博客下看!

    未完待续========================================================!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    展开全文
  • 入门学习Linux常用必会60个命令实例详解doc/txt

    千次下载 热门讨论 2011-06-09 00:08:45
    Linux 是一个真正的多用户操作系统,可以同时接受多个用户登录,还允许一个用户进行多次登录。这是因为Linux和许多版本的Unix一样,提供了虚拟控制台的访问方式,允许用户在同一时间从控制台(系统的控制台是与系统...
  • Apache用户认证

    2018-12-04 23:35:24
    用户认证用途:当一个网站被访问是需要输入用户名和密码才能进入,而不是直接进入登录页面。 认证形式:针对整个网站目录进行认证 针对单个访问文件进行认证 修改虚拟主机配置 [root@zhounan ~]# vim /usr/...
  • Apache 用户认证

    2018-05-12 21:32:53
    平常工作中,有必要对一些特定的页面做用户认证,就是登录进去的时候,要先输入用户名和密码才可以进入,这样做比较安全。那么用户认证怎么做呢?具体操作见下图,输入命令 cat /usr/local/apache2.4/conf/extra/...
  • apache用户认证

    2013-12-30 16:23:35
    在这个练习中,可以对Red Hat Linux系统的Apache Web服务器的目录执行访问控制。使用.htaccess访问文件和htpasswd程序为一个日录建立ACL。这个目录称为/acltest.1.以root身份登录Linux系统。2.检查是否安装了Web服务...
  • 一、准备工作: 提示:如果想要跳过第一步,直接进入第二步添加或者是修改用户名和密码。 请使用该加密工具(jar包):https://download.csdn.net/download/shtdayu/10812371 Step1.... Step2....org.springfr...
  • apache mod_auth设置访问用户登录

    千次阅读 2013-03-01 12:41:47
    apache 通过mod_auth模块能设置用户验证功能,具体有两个步骤 1、生成密码文件,文件中包含用户名和密码,默认密码是md5编码的 比如在/usr/share/monitorix目录下运行 sudo htpasswd -cb .passwd monitorix ...
  • Apache 服务器 协议 1. http 明文传递 版本 1) 1.0 一次连接一次请求 2) 1.1 一次连接多次请求 ...安装apache,实现登陆用户的身份验证 1. 安装apache [root@apache-server ~]# vim /etc...
  • 多人聊天+用户在线 21个目标文件 摘要:JAVA源码,媒体网络,山寨QQ,Java聊天程序 Java编写的山寨QQ,多人聊天+用户在线,程序分服务端和客户端,典型C/S结构, 当用户发送第一次请求的时候,验证用户登录,创建一个该...
  • 1.apache shiro获取当前登录用户的方法是 User user = (User) SecurityUtils.getSubject().getPrincipal(); // 这里获取的当前登录的整个用户实体,得到后直接就是实体数据,可以直接使用user.getId(),user....
  • Apache登录配置

    千次阅读 2012-01-13 01:16:23
    Apache服务器已经内置用户验证机制,大家只要适当的加以设置,便可以控制网站的某些部分要用户验证。 第1步: 我们在/usr/local/apache/htdocs/(apache的主页根目录)下建立一个test目录 mkdir /usr/local/...

空空如也

1 2 3 4 5 ... 20
收藏数 2,452
精华内容 980
关键字:

登录apache用户